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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk