使用System :: String :: Format和LPTSTR(wchar_t *)来自非托管代码

时间:2014-04-04 06:12:44

标签: string c++-cli

我有一个从FormatMessage返回的LPTSTR(wchar_t *)字符串,我想在String :: Format中使用但我无法弄清楚如何指定它。请考虑以下代码行:

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 - 显然,编译器认为szErrMsg出于某种原因是一个bool。它甚至给了我关于布尔转换的性能警告。

最后的消息大约有三个部分,如果我可以使用一次调用:: Format来构建它,那就太好了。

建议?

1 个答案:

答案 0 :(得分:7)

String :: Format()的第二个参数是 param数组。与函数(如printf())在C语言中使用的...大致相似。在引擎盖下,它是一个托管的对象数组,声明在C ++ / CLI语法中如下所示:

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

因此,硬性要求是您传递的参数可以转换为System :: Object。 Format()方法依赖于实现ToString()的这些对象,所有托管对象都可以。

当然,AString没问题,它是一个托管字符串,它的ToString()方法只返回相同的字符串。

字符串文字没问题,编译器隐式地将任何字符串文字转换为System :: String。它会自动发出创建String对象所需的代码。请注意,不需要在文字前面添加L。

wchar_t*的大问题,它是一个非托管指针。它们永远不会隐式转换为任何托管类型。 System :: IntPtr将是最接近的可能匹配,但它根本没用,因为这只是一个无类型的指针值。所以你必须自己编写代码才能进行转换。你已经知道它的样子了:

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