我有一个函数,其参数为LPCTSTR
我想将该函数中的参数与std :: string
连接起来根据我在转换后使用的建议之一:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
wstring cid = (WCHAR*)i_bstrCameraName;
string fcid;
for (char x : cid)
fcid += x;
std::string myURL = "SOME IP";
**//I want to concatenate myURL with i_bstrCameraName here**
return myURL;
}
但这会导致数据丢失,例如,在参数中传递的值是“ abcdefg”,但我的fcid却获得了“ aceg”值。
答案 0 :(得分:2)
LPCTSTR
是const TCHAR*
的别名,其中TCHAR
是char
或wchar_t
,具体取决于项目配置。
如果您的项目配置为将i_bstrCameraName
映射到WCHAR*
,则将TCHAR
强制转换为char
是错误的。只需按原样使用char
数据即可。
如果将wchar_t
配置为映射到char
,则for
循环中的TCHAR
字符到wchar_t
的转换是错误的。这将丢失非ASCII字符的数据。您需要使用WideCharToMultiByte()
或等效于将wchar_t
数据正确地转换为char
的。
您真的不应该在现代代码中完全使用基于TCHAR
的功能。自从Microsoft将用户从基于ANSI的Win9x / ME迁移到基于Unicode的WinNT +以来,就不需要这样做了。
但是,如果必须的话,您的代码应该看起来更像这样:
std::string PlaybackStart(LPCTSTR i_bstrCameraName)
{
string fcid;
#ifdef UNICODE
int wlen = lstrlenW(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
#else
fcid = i_bstrCameraName;
#endif
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}
话虽如此,参数名称i_bstrCameraName
暗示该参数实际上应声明为BSTR
,而不是LPCTSTR
。 BSTR
是OLECHAR*
的别名,又名wchar_t*
,例如:
std::string PlaybackStart(BSTR i_bstrCameraName)
{
string fcid;
int wlen = SysStringLen(i_bstrCameraName);
int len = WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, NULL, 0, NULL, NULL);
fcid.resize(len);
WideCharToMultiByte(CP_ACP, 0, i_bstrCameraName, wlen, &fcid[0], len, NULL, NULL);
std::string myURL = "SOME IP";
myURL += fcid;
return myURL;
}