如何在C ++中将LPCTSTR转换为std :: string

时间:2020-08-17 07:28:51

标签: c++ stdstring

我有一个函数,其参数为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”值。

1 个答案:

答案 0 :(得分:2)

LPCTSTRconst TCHAR*的别名,其中TCHARcharwchar_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,而不是LPCTSTRBSTROLECHAR*的别名,又名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;
}