类型为"char *"的参数与类型为"STRSAFE_LPCWSTR

argument of type "char *" is incompatible with parameter of type "STRSAFE_LPCWSTR

本文关键字:类型 STRSAFE LPCWSTR char 参数      更新时间:2023-10-16

我有以下内容:

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的"Long Pointer to STRing"或char *, LPWSTR是Microsoft的"Long Pointer to Wide-c STRing"或wchar_t *。另外,LPCSTRLPCWSTR引用const变量。

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

宽字符串常量以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

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