将 wstring 转换为WS_STRING



将 wstring 转换为 WS_STRING 的最佳方法是什么?

尝试使用宏:

wstring d=L"ddd";
WS_STRING url = WS_STRING_VALUE(d.c_str()) ;

并且有错误:

cannot convert from 'const wchar_t *' to 'WCHAR *'  

简短回答:

WS_STRING url = {};
url.length = d.length();
WsAlloc(heap, sizeof(WCHAR) * url.length, (void**)&url.chars, error);
memcpy(url.chars, d.c_str(), sizeof(WCHAR) * url.length); // Don't want a null terminator

长答案:

不要在除WCHAR[]以外的任何东西上使用WS_STRING_VALUE。 您可以使用const_cast<>编译它,但会遇到两个问题:

  1. 由于宏使用 RTL_NUMBER_OF 而不是查找 null 终止,WS_STRING将具有不正确的 length 成员。
  2. WS_STRING只会引用d - 它不会复制。 如果它是一个局部变量,这显然是有问题的。

相关代码片段:

//  Utilities structure
//  
//   An array of unicode characters and a length.
//  
struct _WS_STRING {
    ULONG length;
    _Field_size_(length) WCHAR* chars;
};
//  Utilities macro
//  
//   A macro to initialize a WS_STRING structure given a constant string.
//  
#define WS_STRING_VALUE(S) { WsCountOf(S) - 1, S }
//  Utilities macro
//  
//   Returns the number of elements of an array.
//  
#define WsCountOf(arrayValue) RTL_NUMBER_OF(arrayValue)

相关内容

  • 没有找到相关文章

最新更新