Cara: Marshal ANSI Strings Menggunakan Interop C++
Topik ini menunjukkan bagaimana string ANSI dapat diteruskan menggunakan Interop C++, tetapi .NET Framework String mewakili string dalam format Unicode, sehingga konversi ke ANSI adalah langkah tambahan. Untuk mengoperasikan dengan jenis string lainnya, lihat topik berikut:
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. Karena file yang hanya berisi fungsi yang tidak dikelola tidak perlu dikompilasi dengan /clr (Common Language Runtime Compilation), file dapat mempertahankan karakteristik performanya.
Contoh: Meneruskan string ANSI
Contoh menunjukkan meneruskan string ANSI dari yang dikelola ke fungsi yang tidak dikelola menggunakan StringToHGlobalAnsi. Metode ini mengalokasikan memori pada tumpukan yang tidak dikelola dan mengembalikan alamat setelah melakukan konversi. Ini berarti bahwa tidak ada penyematan yang diperlukan (karena memori pada tumpukan GC tidak diteruskan ke fungsi yang tidak dikelola) dan bahwa IntPtr yang dikembalikan dari StringToHGlobalAnsi harus dirilis secara eksplisit atau hasil kebocoran memori.
// MarshalANSI1.cpp
// compile with: /clr
#include <iostream>
#include <stdio.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma unmanaged
void NativeTakesAString(const char* p) {
printf_s("(native) received '%s'\n", p);
}
#pragma managed
int main() {
String^ s = gcnew String("sample string");
IntPtr ip = Marshal::StringToHGlobalAnsi(s);
const char* str = static_cast<const char*>(ip.ToPointer());
Console::WriteLine("(managed) passing string...");
NativeTakesAString( str );
Marshal::FreeHGlobal( ip );
}
Contoh: Marshaling data diperlukan untuk mengakses string ANSI
Contoh berikut menunjukkan marshaling data yang diperlukan untuk mengakses string ANSI dalam fungsi terkelola yang dipanggil oleh fungsi yang tidak dikelola. Fungsi terkelola, saat menerima string asli, dapat menggunakannya secara langsung atau mengonversinya menjadi string terkelola menggunakan metode , seperti yang ditunjukkan PtrToStringAnsi .
// MarshalANSI2.cpp
// compile with: /clr
#include <iostream>
#include <vcclr.h>
using namespace std;
using namespace System;
using namespace System::Runtime::InteropServices;
#pragma managed
void ManagedStringFunc(char* s) {
String^ ms = Marshal::PtrToStringAnsi(static_cast<IntPtr>(s));
Console::WriteLine("(managed): received '{0}'", ms);
}
#pragma unmanaged
void NativeProvidesAString() {
cout << "(native) calling managed func...\n";
ManagedStringFunc("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