C++ 中封送處理的概觀
在混合模式中,您必須有方式封送處理您在原生及 Managed 資料和 Managed 型別。 Visual Studio 2008 介紹封送處理程式庫以協助您用簡單的方法封送處理和呈現資料。
您可以使用封送處理程式庫無論有沒有 marshal_context 類別。 有些轉換需要內容。 使用 marshal_as 函式可以實作其他轉換。 下表列出目前支援的轉換,無論它們是否需要內容,以及編譯的檔案必須包含:
來自型別: |
到型別 |
封送處理方法 |
包含檔案 |
---|---|---|---|
System::String^ |
const char * |
marshal_context |
marshal.h |
const char * |
System::String^ |
marshal_as |
marshal.h |
char* |
System::String^ |
marshal_as |
marshal.h |
System::String^ |
const wchar_t* |
marshal_context |
marshal.h |
const wchar_t * |
System::String^ |
marshal_as |
marshal.h |
wchar_t* |
System::String^ |
marshal_as |
marshal.h |
System::IntPtr。 |
HANDLE |
marshal_as |
marshal_windows.h |
HANDLE |
System::IntPtr。 |
marshal_as |
marshal_windows.h |
System::String^ |
BSTR |
marshal_context |
marshal_windows.h |
BSTR |
System::String^ |
marshal_as |
marshal.h |
System::String^ |
bstr_t |
marshal_as |
marshal_windows.h |
bstr_t |
System::String^ |
marshal_as |
marshal_windows.h |
System::String^ |
std::string |
marshal_as |
marshal_cppstd.h |
std::string |
System::String^ |
marshal_as |
marshal_cppstd.h |
System::String^ |
std::wstring |
marshal_as |
marshal_cppstd.h |
std::wstring |
System::String^ |
marshal_as |
marshal_cppstd.h |
System::String^ |
CStringT<char> |
marshal_as |
marshal_atl.h |
CStringT<char> |
System::String^ |
marshal_as |
marshal_atl.h |
System::String^ |
CStringT<wchar_t> |
marshal_as |
marshal_atl.h |
CStringT<wchar_t> |
System::String^ |
marshal_as |
marshal_atl.h |
System::String^ |
CComBSTR |
marshal_as |
marshal_atl.h |
CComBSTR |
System::String^ |
marshal_as |
marshal_atl.h |
只有在您從 Managed 封送處理為原生資料型別,您要轉換的原生型別沒有自動的解構函式清除時,封送處理才需要內容,。 封送處理內容在其解構函式中終結配置的原生資料型別。 因此,只有在內容刪除後需要內容的轉換才有效,。 若要儲存所有封送處理的值,您必須將值複製到您的變數。
注意事項 |
---|
如果您在字串中嵌入 NULL,則無法保證封送處理字串的結果。內嵌 NULL可能導致資料截斷或它們可能儲存。 |
封送處理程式庫集合中位於指定 msclr 子目錄的 Include 目錄。 這個範例會顯示如何將 msclr 目錄從 include的標頭宣告:
#include "msclr\marshal_cppstd.h"
封送處理程式庫是可擴充的,以便將封送處理型別。 如需封送處理程式庫的詳細資訊,請參閱 如何:擴充封送處理程式庫。
在較舊的版本中,您可以使用 平台叫用 以封送處理資料。 如需 PInvoke 的詳細資訊,請參閱 從 Managed 程式碼呼叫原生函式。