0

wstring を WS_STRING に変換する最良の方法は何ですか?

マクロを試す:

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

そしてエラーがあります:

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

1 に答える 1

1

簡潔な答え:

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

長い答え:

WS_STRING_VALUE以外には使用しないでくださいWCHAR[]。を使用してコンパイルできますconst_cast<>が、次の 2 つの問題が発生します。

  1. ヌル終端を探す代わりにマクロが を使用するため、 には正しくないメンバーが含まWS_STRINGれます。lengthRTL_NUMBER_OF
  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)
于 2015-01-16T01:00:27.140 に答える