Nasıl yapılır: C++ Çalışabilirliği Kullanarak Unicode Dizelerini Sıralama
Bu konu başlığında Visual C++ birlikte çalışabilirliğinin bir özelliği gösterilmektedir. Daha fazla bilgi için bkz . C++ Birlikte Çalışma Kullanma (Örtük PInvoke).
Aşağıdaki kod örnekleri yönetilen ve yönetilmeyen işlevleri aynı dosyada uygulamak için yönetilen, yönetilmeyen #pragma yönergelerini kullanır, ancak bu işlevler ayrı dosyalarda tanımlanırsa aynı şekilde birlikte çalışır. Yalnızca yönetilmeyen işlevleri içeren dosyaların /clr (Ortak Dil Çalışma Zamanı Derlemesi) ile derlenmesi gerekmez.
Bu konu başlığında Unicode dizelerinin yönetilen bir işlevden yönetilmeyen bir işleve nasıl geçirilebileceği ve tam tersi gösterilmektedir. Diğer dize türleriyle birlikte çalışma 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: Unicode dizesini yönetilen işlevden yönetilmeyen işleve geçirme
Yönetilen bir unicode dizesini yönetilmeyen bir işleve geçirmek için, yönetilen dizenin depolandığı belleğe erişmek için PtrToStringChars işlevi (Vcclr.h ile bildirilir) kullanılabilir. Bu adres yerel bir işleve geçirileceğinden, yönetilmeyen işlev yürütülürken bir çöp toplama döngüsü gerçekleşirse, dize verilerinin yeniden yerleştirilmesini önlemek için belleğin pin_ptr (C++/CLI) ile sabitlenmesi ö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 );
}
Örnek: Unicode dizesine erişmek için gereken veri hazırlama
Aşağıdaki örnek, yönetilmeyen bir işlev tarafından çağrılan yönetilen bir işlevdeki Unicode dizesine erişmek için gereken veri hazırlamayı gösterir. Yönetilen işlev, yerel Unicode dizesini alırken yöntemini kullanarak bunu yönetilen dizeye PtrToStringUni 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();
}