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:
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak ANSI Dizelerini Sıralama
Nasıl yapılır: C++ Birlikte Çalışması Kullanarak COM Dizelerini Sıralama
Ö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();
}