Конвертировать 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 *'  

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<> но вы столкнетесь с двумя проблемами:

  1. WS_STRING будет иметь неправильный length член из-за использования макроса RTL_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)
Другие вопросы по тегам