аргумент типа & quot; char * & quot; несовместим с параметром типа «STRSAFE_LPCWSTR»

У меня есть следующее:

DYNAMIC_TIME_ZONE_INFORMATION dtzRecorder;
GetDynamicTimeZoneInformation(&dtzRecorder);

Я обычно делаю следующее, чтобы скопировать новое имя:

StringCchCopy(dtzRecorder.TimeZoneKeyName, 128, L"GMT Standard Time");

Но теперь мне нужно сделать следующее:

char tzKey[51];

std::string timezone("someTimeZOneName");
strncpy_s(MyStruct.tzKey, timezone.c_str(), _TRUNCATE);

StringCchCopy(dtzRecorder.TimeZoneKeyName, 128, MyStruct.tzKey); <--Error

Но я получаю ошибку:

Аргумент типа «char *» несовместим с параметром типа «STRSAFE_LPCWSTR»

Как я могу скопировать это в dtzRecorder.TimeZoneKeyName ??

-1

Решение

Основная проблема заключается в том, что dtzRecorder.TimeZoneKeyName это широкий строка (wchar_t[]), но tzKey это узкий строка (char[]).

Самый простой способ решить эту проблему — использовать wchar_t за tzKey, тоже:

wchar_t tzKey[51];

std::wstring timezone(L"someTimeZOneName");
wcsncpy_s(MyStruct.tzKey, timezone.c_str(), _TRUNCATE);

StringCchCopy(dtzRecorder.TimeZoneKeyName, 128, MyStruct.tzKey);
2

Другие решения

LPSTR такое Microsoft для «Длинного указателя на STRING» или char *, LPWSTR такое Microsoft для «Длинного указателя на Wide-c STring» или wchar_t *, Дополнительно LPCSTR а также LPCWSTR обратитесь к постоянным вариантам.

Ошибка, которую вы видите, происходит от передачи LPCSTR (постоянный символьный указатель) на функцию, ожидающую LPWSTR (неконстантный юникод / ​​указатель широких символов).

Широкие строковые константы обозначены L префикс (L"wide"), как правило, имеют тип wchar_t* и требуют вариант std::string называется std::wstring,

То, что по умолчанию для большинства системных вызовов Windows, обрабатывается общей настройкой проекта «Набор символов», если это «Юникод», тогда требуются широкие строки. Поддержка для этого предоставляется <tchar.h> увидеть https://msdn.microsoft.com/en-us/library/dybsewaf.aspx

#include <tchar.h>

// tchar doesn't help with std::string/std::wstring, so use this helper.
#ifdef _UNICODE
#define TSTRING std::wstring
#else
#define TSTRING std::string
#endif

// or as Matt points out
typedef std::basic_string<_TCHAR> TSTRING;

// Usage
TCHAR tzKey[51];  // will be char or wchar_t accordingly
TSTRING timezone(_T("timezonename")); // string or wstring accordingly
_tscncpy_s(tzKey, timezone.c_str(), _TRUNCATE);

В качестве альтернативы вы можете просто быть откровенным об использовании широких

wchar_t tzKey[51]; // note: this is not 51 bytes
std::wstring timezone(L"timezonename");
wscncpy_s(tzKey, timezone.c_str(), _TRUNCATE);

Кстати, почему бы просто не сделать это:

std::wstring timezone(L"tzname");
timezone.erase(50); // limit length

Зачем тратить время на копирование значения, когда вы можете просто вставить нулевой терминатор в пределе?

1

По вопросам рекламы [email protected]