Bagikan melalui


Cara: String Marshal Unicode Menggunakan Interop C++

Topik ini menunjukkan satu faset interoperabilitas Visual C++. Untuk informasi selengkapnya, lihat Menggunakan Interop C++ (PInvoke Implisit).

Contoh kode berikut menggunakan arahan #pragma terkelola dan tidak dikelola untuk mengimplementasikan fungsi terkelola dan tidak terkelola dalam file yang sama, tetapi fungsi-fungsi ini beroperasi dengan cara yang sama jika ditentukan dalam file terpisah. File yang hanya berisi fungsi yang tidak dikelola tidak perlu dikompilasi dengan /clr (Kompilasi Runtime Bahasa Umum).

Topik ini menunjukkan bagaimana string Unicode dapat diteruskan dari yang dikelola ke fungsi yang tidak dikelola, dan sebaliknya. Untuk mengoperasikan dengan jenis string lain, lihat topik berikut:

Contoh: Meneruskan string Unicode dari fungsi terkelola ke tidak terkelola

Untuk meneruskan string Unicode dari yang dikelola ke fungsi yang tidak dikelola, fungsi PtrToStringChars (dinyatakan dalam Vcclr.h) dapat digunakan untuk mengakses dalam memori tempat string terkelola disimpan. Karena alamat ini akan diteruskan ke fungsi asli, penting bahwa memori disematkan dengan pin_ptr (C++/CLI) untuk mencegah data string direlokasi, jika siklus pengumpulan sampah terjadi saat fungsi yang tidak dikelola dijalankan.

// 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 );
}

Contoh: Marshaling data diperlukan untuk mengakses string Unicode

Contoh berikut menunjukkan marshaling data yang diperlukan untuk mengakses string Unicode dalam fungsi terkelola yang disebut oleh fungsi yang tidak dikelola. Fungsi terkelola, saat menerima string Unicode asli, mengonversinya menjadi string terkelola menggunakan PtrToStringUni metode .

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

Baca juga

Menggunakan interop C++ (PInvoke implisit)