-1

我有以下内容:

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?

4

2 回答 2

2

基本问题是dtzRecorder.TimeZoneKeyName字符串wchar_t[]),但是tzKey字符串(char[])。

解决它的最简单方法也是使用wchar_tfor tzKey

wchar_t tzKey[51];

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

StringCchCopy(dtzRecorder.TimeZoneKeyName, 128, MyStruct.tzKey); 
于 2015-05-27T22:52:34.717 回答
1

LPSTR是 Microsoft 的“Long Pointer to STRing”或char *LPWSTR是 Microsoft 的“Long Pointer to Wide-c STring”或wchar_t *. 另外LPCSTRLPCWSTR参考 const 变体。

您看到的错误来自将LPCSTR(const 字符指针)传递给期望LPWSTR(非常量 unicode/宽字符指针)的函数。

宽字符串常量用L前缀 ( L"wide") 表示,通常具有类型wchar_t*并需要std::string调用的变体std::wstring

这是大多数 Windows 系统调用的默认设置,由通用项目设置“字符集”处理,如果是“Unicode”,则需要宽字符串。<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

当您可以在限制处插入空终止符时,为什么要浪费时间复制值?

于 2015-05-28T00:53:21.657 回答