您目前已離線,請等候您的網際網路重新連線

如何在 Visual C++ 中將 System::String * 轉換為 Char *

本文參照下列 Microsoft .NET Framework Class Library 命名空間:
  • System::Runtime::InteropServices
  • Msclr::interop
結論
本文將告訴您從 System::String * 轉換為 char * 的幾種方式,方法如下:
  • 利用 Microsoft Visual C++ .NET 2002 和 Microsoft Visual C++ .NET 2003 的受管理擴充功能
  • 利用 Microsoft Visual C++ 2005 和 Microsoft Visual C++ 2008 中的 ++/CLI

方法 1

PtrToStringChars 為您的實際 String 物件提供內部指標。如果您將此指標傳遞至為未受管理的函數呼叫,您必須先定義指標,確認物件在非同步記憶體回收程序期間不會移動:
//#include <vcclr.h>System::String * str = S"Hello world\n";const __wchar_t __pin * str1 = PtrToStringChars(str);wprintf(str1);					

方法 2

StringToHGlobalAnsi 將受管理的 String 物件內容複製到原生堆積,然後在作業中將其轉換為「美國國家標準局」(American National Standards Institute,ANSI) 格式。這個方法會配置必要的原生堆積記憶體:
//using namespace System::Runtime::InteropServices;System::String * str = S"Hello world\n";char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);printf(str2);Marshal::FreeHGlobal(str2);				
注意 在 Visual C++ 2005 和 Visual C++ 2008 中,您必須新增 Common Language Runtime 支援編譯器選項 (/clr:oldSyntax),才能成功編譯前一個範例程式碼。如果要新增 Common Language Runtime 支援編譯器,請依照下列步驟執行:
  1. 按一下 [專案],然後按一下 [ProjectName 屬性]

    注意 ProjectName 是您專案名稱的預留位置。
  2. 展開 [組態屬性],然後按一下 [一般]
  3. 在右邊窗格中,按一下選取 Common Language Runtime support 專案設定中的 Common Language Runtime 支援,Old Syntax (/clr:oldSyntax)
  4. 按一下 [套用],然後按一下 [確定]
如需有關 Common Language Runtime 支援編譯器的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站: 這些步驟適用於整個文章。

方法 3

VC7 CString 類別具有包含受管理的 String 指標,且會載入 CString 和內容的建構函式:
//#include <atlstr.h>System::String * str = S"Hello world\n";CString str3(str); printf(str3);				

方法 4

Visual C++ 2008 引入 marshal_as<T> 封送處理說明類別和 marshal_context() 封送處理協助程式類別。
//#include <msclr/marshal.h>//using namespace msclr::interop;marshal_context ^ context = gcnew marshal_context();const char* str4 = context->marshal_as<const char*>(str);puts(str4);delete context;
注意 此程式碼不是用 Visual C++ .NET 2002 或 Visual C++ .NET 2003 的 C++ 專用的擴充功能編譯,而是使用引入 Visual C++ 2005 的全新 C++/CLI 語法以及引入 Visaul C++ 2008 的全新 msclr 命名空間程式碼。如果要成功編譯此程式碼,您必須使用 Microsoft Visual C++ 2008 中的 /clr C++ 編譯器參數。

C++ 專用受管理的擴充功能範例程式碼 (Visual C++ 2002 或 Visual C++ 2003)

//compiler option: cl /clr  #include <vcclr.h>#include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;int _tmain(void){   	System::String * str = S"Hello world\n";	//method 1	const __wchar_t __pin * str1 = PtrToStringChars(str);	wprintf(str1);		//method 2	char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(str);	printf(str2);	Marshal::FreeHGlobal(str2);	//method 3	CString str3(str); 	wprintf(str3);    return 0;}				

C++/CLI 範例程式碼 (Visual C++ 2005 和 Visual C++ 2008)

//compiler option: cl /clr #include <atlstr.h>#include <stdio.h>#using <mscorlib.dll>using namespace System;using namespace System::Runtime::InteropServices;#if _MSC_VER > 1499 // Visual C++ 2008 only#include <msclr/marshal.h>using namespace msclr::interop;#endif int _tmain(void){		     System::String ^ str = "Hello world\n";	     /method 1	     pin_ptr<const wchar_t> str1 = PtrToStringChars(str);     	wprintf(str1);		     //method 2	     char* str2 = (char*)Marshal::StringToHGlobalAnsi(str).ToPointer();     	printf(str2);	     Marshal::FreeHGlobal((IntPtr)str2);	     //method 3	     CString str3(str); 	     wprintf(str3);     	//method 4#if _MSC_VER > 1499 // Visual C++ 2008 only	     marshal_context ^ context = gcnew marshal_context();	     const char* str4 = context->marshal_as<const char*>(str);     	puts(str4);	     delete context;#endif	return 0;}
参考
如需其他熱門的 Visual C++.NET Mircrosoft 知識庫文章,請造訪下列 Microsoft 網站:
kbVC700
注意 :本文屬於「快速發佈」文章,係由 Microsoft 技術支援或組織內部直接建立。 本文所包含的資訊是為了回應新問題而依現況提供。 因此為了迅速對外發佈,文章內容可能含有印刷錯誤,而且可能會在不另行通知的情況下進行修改。 如需其他考量事項,請參閱使用規定
內容

文章識別碼:311259 - 最後檢閱時間:04/29/2014 10:23:00 - 修訂: 1.0

Microsoft Visual C++ 2008 Express Edition, Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition

  • kbhowtomaster kbmanaged kbnewsgrouplink KB311259
意見反應