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:

Ö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();
}

Ayrıca bkz.

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