У меня есть следующее:
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 ??
Основная проблема заключается в том, что 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);
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
Зачем тратить время на копирование значения, когда вы можете просто вставить нулевой терминатор в пределе?