Bagikan melalui


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

Menggunakan interop C++ (PInvoke implisit)