2014-04-04 97 views
2

蜇使用系統::字符串::格式我有一個會從的FormatMessage返回的LPTSTR(wchar_t的*)的字符串,我想在一個字符串使用::格式,但我無法弄清楚如何指定它。考慮這些代碼行:與LPTSTR(wchar_t的*)從非託管代碼

wchar_t * szErrMsg = L"Error Msg from Unmanaged"; // faking the message from FormatMessage 
System::String^ AString = gcnew System::String(szErrMsg); // works 
System::String^ BString = System::String::Format(L"{0}.", AString); // works 
System::String^ CString = System::String::Format(L"{0}.", szErrMsg); // no overloads match 
System::String^ DString = System::String::Format(L"{0}.", L"Error Msg from Unmanaged"); // works 

AString和BString工作正常。有趣的是,DString也可以。但不是CString。

我當然可以將所有消息片段變成:: String對象(如AString),然後將整個消息格式化爲另一個字符串(如BString),但我寧願放棄,如果可以正確地指定CString,以便它可以工作。我懷疑這是可能的,因爲DString的作品。

我也試過:: StringBuilder的,並得到了與.Append一些野趣的結果 - 顯然compilier認爲szErrMsg是由於某種原因,一個bool。它甚至給我關於bool轉換的性能警告。

最終消息有三個部分,如果我可以使用:: Format來構建它,那將會很好。

對此提出建議?

回答

6

字符串::格式的第二參數()是一個參數數組。與用於printf()等函數的C語言中大致類似的...。引擎蓋下,它是對象管理的陣列,聲明看起來像在C++/CLI語法:

static String^ Format(String^ format, ... array<Object^>^ args); 

所以很難要求是,你傳遞參數可以轉換爲系統::對象。 Format()方法依賴於實現ToString()的這些對象,所有託管對象都可以。

當然是有ASTRING沒問題,這是一個管理的字符串,它的toString()方法簡單地返回相同的字符串。

沒有問題的字符串文字,編譯器隱式地將任何字符串文字轉換爲System :: String。它會自動發出創建String對象所需的代碼。請注意,使用L前綴字面量不是必需的。

大問題wchar_t*,它是一個非託管的指針。它們從不隱式轉換爲任何託管類型。 System :: IntPtr將是最接近的匹配,但它根本沒用,因爲這只是一個無類型的指針值。所以你必須親自編寫代碼才能進行轉換。你已經知道它是什麼樣子:

String^ CString = String::Format("{0}.", gcnew String(szErrMsg)); 
+0

鼠!我希望有某種方式可以告訴:: Format參數是一個非託管的字符串指針,並且請轉換(就像:: String構造函數所能做的那樣)作爲進程的一部分。謝謝。 – Greg