如何:使用 C++ Interop 封送處理 ANSI 字串
本主題示範如何使用 C++ Interop 傳遞 ANSI 字串串,但 .NET Framework String 代表 Unicode 格式的字串串,因此轉換成 ANSI 是額外的步驟。 如需與其他字串類型互通,請參閱下列主題:
下列程式代碼範例會使用 Managed、Unmanaged #pragma 指示詞,在相同的檔案中實作 Managed 和 Unmanaged 函式,但如果在個別檔案中定義,這些函式會以相同方式互操作。 因為只包含 Unmanaged 函式的檔案不需要使用 /clr (Common Language Runtime Compile) 進行編譯,所以它們可以保留其效能特性。
範例:傳遞 ANSI 字串
此範例示範如何使用 StringToHGlobalAnsi將 ANSI 字串從 Managed 傳遞至 Unmanaged 函式。 這個方法會在 Unmanaged 堆積上設定記憶體,並在執行轉換之後傳回位址。 這表示不需要釘選(因為 GC 堆積上的記憶體未傳遞至 Unmanaged 函式),而且必須明確釋放從 StringToHGlobalAnsi 傳回的 IntPtr 或記憶體流失結果。
// 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 );
}
範例:存取 ANSI 字串所需的數據封送處理
下列範例示範存取 Unmanaged 函式所呼叫 Managed 函式中 ANSI 字串所需的數據封送處理。 在接收原生字串時,Managed 函式可以直接使用它,或使用 方法將它轉換成 Managed 字串 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();
}