共用方式為


如何:使用 C++ Interop 封送處理 Unicode 字串

本主題示範 Visual C++ 互通性的一個 Facet。 如需詳細資訊,請參閱 使用 C++ Interop (隱含 PInvoke)

下列程式碼範例會使用 Managed、Unmanaged #pragma 指示詞,在相同的檔案中實作 Managed 和 Unmanaged 函式,但如果在個別檔案中定義,這些函式會以相同方式交互操作。 僅包含 Unmanaged 函式的檔案不需要使用 /clr 進行編譯(Common Language Runtime 編譯)。

本主題示範如何將 Unicode 字串從 Managed 傳遞至 Unmanaged 函式,反之亦然。 如需與其他字串類型交互操作,請參閱下列主題:

範例:將 Unicode 字串從 Managed 傳遞至 Unmanaged 函式

若要將 Unicode 字串從 Managed 傳遞至 Unmanaged 函式,PtrToStringChars 函式(在 Vcclr.h 中宣告)可用來存取儲存 Managed 字串的記憶體。 由於此位址會傳遞至原生函式,因此請務必使用 pin_ptr (C++/CLI) 釘選 記憶體,以防止重新放置字串資料,在 Unmanaged 函式執行時發生垃圾收集週期。

// 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 );
}

範例:存取 Unicode 字串所需的資料封送處理

下列範例示範存取 Unmanaged 函式所呼叫之 Managed 函式中 Unicode 字串所需的資料封送處理。 在接收原生 Unicode 字串時,Managed 函式會使用 PtrToStringUni 方法將它轉換成 Managed 字串。

// 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();
}

另請參閱

使用 C++ Interop (隱含 PInvoke)