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

文章翻譯 文章翻譯
文章編號: 311259 - 檢視此文章適用的產品。
本文參照下列 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) 網站:
http://msdn.microsoft.com/zh-tw/library/k8d11d4s.aspx
這些步驟適用於整個文章。

方法 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 網站:
http://www.visualstudio.com/zh-tw/support/support-overview-vs
注意 :本文屬於「快速發佈」文章,係由 Microsoft 技術支援或組織內部直接建立。 本文所包含的資訊是為了回應新問題而依現況提供。 因此為了迅速對外發佈,文章內容可能含有印刷錯誤,而且可能會在不另行通知的情況下進行修改。 如需其他考量事項,請參閱使用規定

屬性

文章編號: 311259 - 上次校閱: 2014年4月29日 - 版次: 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
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com