在Visual C++ 中從System::String 轉換為Char - C#

文章推薦指數: 80 %
投票人數:10人

本文說明在Visual C++ 中使用Managed 擴充功能,從System::String* 轉換成char* 的幾種方式。

跳到主要內容 已不再支援此瀏覽器。

請升級至MicrosoftEdge,以利用最新功能、安全性更新和技術支援。

下載MicrosoftEdge 其他資訊 目錄 結束焦點模式 閱讀英文 儲存 目錄 閱讀英文 儲存 編輯 Twitter LinkedIn Facebook 電子郵件 目錄 在VisualC++中從System::String轉換為Char 發行項 05/08/2022 2位參與者 本文內容 本文說明在VisualC++中使用Managed擴充功能從轉換System::String*char*成的數種方式。

原始產品版本: VisualC++ 原始KB編號: 311259 摘要 本文參考下列Microsoft.NETFramework類別庫命名空間: System::Runtime::InteropServices Msclr::interop 本文討論使用下列方法從System::String*char*轉換成的數種方式: VisualC++.NET2002和VisualC++.NET2003中C++的Managed延伸模組 VisualC++2005和VisualC++2008中的C++/CLI 方法1 PtrToStringChars提供實際String物件的內部指標。

如果您將此指標傳遞至Unmanaged函式呼叫,您必須先釘選指標,以確保物件不會在非同步垃圾收集程式期間移動: //#include System::String*str=S"Helloworld\n"; const__wchar_t__pin*str1=PtrToStringChars(str); wprintf(str1); 方法2 StringToHGlobalAnsi將ManagedString物件的內容複寫到原生堆積,然後將它轉換成美國國家標準局(ANSI)格式。

這個方法會配置必要的原生堆積記憶體: //usingnamespaceSystem::Runtime::InteropServices; System::String*str=S"Helloworld\n"; char*str2=(char*)(void*)Marshal::StringToHGlobalAnsi(str); printf(str2); Marshal::FreeHGlobal(str2); 注意 在VisualC++2005和VisualC++2008中,您必須將CommonLanguageRuntime支援編譯器選項新增(/clr:oldSyntax),才能成功編譯先前的程式碼範例。

若要新增CommonLanguageRuntime支援編譯器選項,請遵循下列步驟: 按一下[Project],然後按一下[專案名稱屬性]。

注意 ProjectName是專案名稱的預留位置。

展開[組態屬性],然後按一下[一般]。

在右窗格中,按一下以在CommonLanguageRuntime支援專案設定中選取[CommonLanguageRuntime支援]、[舊語法(/clr:oldSyntax)]。

在[撥號對應表(電話內容)]方塊中,按一下[瀏覽]以尋找使用者的撥號對應表。

如需CommonLanguageRuntime支援編譯器選項的詳細資訊,請造訪下列MicrosoftDeveloperNetwork(MSDN)網站: /clr(CommonLanguageRuntime編譯) 這些步驟適用于整篇文章。

方法3 VC7CString類別有一個建構函式,可接受ManagedString指標,並載入CString及其內容: //#include System::String*str=S"Helloworld\n"; CStringstr3(str); printf(str3); 方法4 VisualC++2008引進封送處理marshal_as說明類別和marshal_context()封送處理協助程式類別。

//#include //usingnamespacemsclr::interop; marshal_context^context=gcnewmarshal_context(); constchar*str4=context->marshal_as(str); puts(str4); deletecontext; 注意 此程式碼不會在VisualC++.NET2002或VisualC++.NET2003中使用C++的Managed擴充功能進行編譯。

它會使用VisualC++2005中引進的新C++/CLI語法,以及在VisualC++2008中引進的新msclr命名空間程式碼。

若要成功編譯此程式碼,您必須在VisualC++2008中使用/clrC++編譯器參數。

ManagedExtensionsforC++VisualC++2002或VisualC++2003(範例程式碼) //compileroption:cl/clr #include #include #include #using usingnamespaceSystem; usingnamespaceSystem::Runtime::InteropServices; int_tmain(void) { System::String*str=S"Helloworld\n"; //method1 const__wchar_t__pin*str1=PtrToStringChars(str); wprintf(str1); //method2 char*str2=(char*)(void*)Marshal::StringToHGlobalAnsi(str); printf(str2); Marshal::FreeHGlobal(str2); //method3 CStringstr3(str); wprintf(str3); return0; } C++/CLI範例程式碼(VisualC++2005和VisualC++2008) //compileroption:cl/clr #include #include #using usingnamespaceSystem; usingnamespaceSystem::Runtime::InteropServices; #if_MSC_VER>1499//VisualC++2008only #include usingnamespacemsclr::interop; #endif int_tmain(void) { System::String^str="Helloworld\n"; //method1 pin_ptrstr1=PtrToStringChars(str); wprintf(str1); //method2 char*str2=(char*)Marshal::StringToHGlobalAnsi(str).ToPointer(); printf(str2); Marshal::FreeHGlobal((IntPtr)str2); //method3 CStringstr3(str); wprintf(str3); //method4 #if_MSC_VER>1499//VisualC++2008only marshal_context^context=gcnewmarshal_context(); constchar*str4=context->marshal_as(str); puts(str4); deletecontext; #endif return0; } 本文內容



請為這篇文章評分?