c++ CLI - 使用 System::String::Format with LPTSTR (wchar_t *)



我有一个从 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

A和B工作正常。 有趣的是,DString也确实如此。 但不是CString。

我当然可以将消息的所有部分更改为 ::String 对象(如 AString),然后将整个消息格式化为另一个字符串(如 BString),但如果可以正确指定 CString 以便它起作用,我宁愿放弃它。 我怀疑这是可能的,因为DString有效。

我还尝试了 ::StringBuilder 并得到了一些有趣的结果。附加 - 显然编译者出于某种原因认为 szErrMsg 是一个布尔值。 它甚至给了我有关布尔转换的性能警告。

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

建议?

String::Format() 的第二个参数是一个参数数组。 大致类似于 C 语言中用于 printf() 等函数的 ...。 在后台,它是一个托管的对象数组,声明在 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)); 

最新更新