如何:使用 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();
}

另請參閱

使用 C++ Interop (隱含 PInvoke)