Nasıl yapılır: C++ Çalışabilirliği Kullanarak Unicode Dizelerini Sıralama

Bu konu Visual C++ çalışabilirliğinin bir yönünü gösterir.Daha fazla bilgi için bkz. C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke).

Aşağıdaki kod örnekleri aynı dosyadaki yönetilen ve yönetilmeyen işlevleri uygulamak için managed, unmanaged #pragma yönergelerini kullanır ancak, bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır.Sadece yönetilmeyen işlevleri içeren dosyalar /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmek zorunda değildir.

Bu konuda Unicode dizelerinin nasıl yönetilen bir işlevden yönetilmeyen bir işleve geçirilebileceği ve tersi gösterilmektedir.Diğer dizgi türleriyle birlikte çalışmak için aşağıdaki konulara bakın:

Örnek

Bir Unicode dizeyi yönetilen bir işlemden yönetilmeyen bir işleme geçirmek için yönetilen dizenin saklandığı belleğe erişmek üzere PtrToStringChars işlevi (Vcclr.h'de belirtilmiş) kullanılabilir.Bu adres bir yerli işleve geçirileceği için, yönetilmeyen işlev çalıştırıldığı zaman çöp toplama döngüsü gerçekleşirse dize verisinin taşınmasını önlemek amacıyla belleğin pin_ptr (C++/CLI) ile tutturulması önemlidir.

// MarshalUnicode1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
#include <vcclr.h>

using namespace std;

using namespace System;
using namespace System::Runtime::InteropServices;

#pragma unmanaged

void NativeTakesAString(const wchar_t* p) {
   printf_s("(native) received '%S'\n", p);
}

#pragma managed
 
int main() {
   String^ s = gcnew String("test string");
   pin_ptr<const wchar_t> str = PtrToStringChars(s);

   Console::WriteLine("(managed) passing string to native func...");
   NativeTakesAString( str );
}

Aşağıdaki örnek yönetilmeyen işlev tarafından çağrılan yönetilen işlevdeki Unicode dizesine erişmek için gereken veri hazırlamayı gösterir.Yerel Unicode dizesini alırken yönetilen işlev PtrToStringUni yöntemini kullanarak yönetilen dizeye dönüştürür.

// MarshalUnicode2.cpp
// compile with: /clr
#include <iostream>

using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;

#pragma managed

void ManagedStringFunc(wchar_t* s) {
   String^ ms = Marshal::PtrToStringUni((IntPtr)s);
   Console::WriteLine("(managed) received '{0}'", ms);
}

#pragma unmanaged

void NativeProvidesAString() {
   cout << "(unmanaged) calling managed func...\n";
   ManagedStringFunc(L"test string");
}

#pragma managed

int main() {
   NativeProvidesAString();
}

Ayrıca bkz.

Başvuru

C++ Birlikte Çalışabilirliği Kullanma (Örtük PInvoke)