将变量传递给WIN32 API LPCWSTR?

陈林奇

最近,我为我的软件制作了一个更新客户端。它使用WinHTTP连接到我公司的服务器,我想在WinHttpOpen的WINDOWS API的用户代理部分中添加一个特殊字符串。我需要将变量传递给WinHttpOpen的pwszUserAgent,它是LPCWSTR。

这是我的代码的一部分

//convert string to wstring
wstring s2ws(const string& s)
{
    int len;
    int slength = (int)s.length() + 1;
    len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
    wstring r(buf);
    delete[] buf;
    return r;
}


//This defined string indicates a string variable I got previously
string MyVariable_grabbed_previously = "version:15.3, Date:2016/12/10"
//a flag indicate if version string variable exists
bool Version_variable = TRUE;

//define LPCWSTR for winAPI user-agent section
LPCWSTR UserAgent;

if (Version_variable) {
//version variable exist
        string UA = "my custom UA & version" + MyVariable_grabbed_previously;
        wstring UAWS = s2ws(UA);
        UserAgent = UAWS.c_str();



    }
    else {
//Version variable not exist
        UserAgent = L"my custom UA";

    }


hSession = WinHttpOpen(UserAgent, WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);

但是,似乎我的程序一直使用空字符串作为User-agent,我想知道为什么我的值不能正确传递吗?我是Windows API的新手。

雷米·勒博(Remy Lebeau)

问题是您将无效的指针传递给WinHttpOpen()您正在创建一个临时的 std::wstring对象,抓住一个指向它的数据,然后通过该指针后,std::wstring被破坏。

UserAgent变量更改std::wstring,然后c_str()在准备传递变量使用它,例如:

wstring s2ws(const string& s)
{
    wstring r;
    int slength = s.length();
    if (slength > 0)
    {
        int len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0);
        r.resize(len);
        MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, &r[0], len);        
    }
    return r;
}

string MyVariable_grabbed_previously = "version:15.3, Date:2016/12/10"; 
bool Version_variable = true;    
wstring UserAgent;

...

if (Version_variable) {
    UserAgent = s2ws("my custom UA & " + MyVariable_grabbed_previously);
}
else {
    UserAgent = L"my custom UA";
}

/* Alternatively:
UserAgent = L"my custom UA";
if (Version_variable) {
    UserAgent += (L" & " + s2ws(MyVariable_grabbed_previously));
}
*/

hSession = WinHttpOpen(UserAgent.c_str(), WINHTTP_ACCESS_TYPE_NO_PROXY, WINHTTP_NO_PROXY_NAME, WINHTTP_NO_PROXY_BYPASS, 0);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

作为 DWORD 传递给 WIN32 API 函数 MonitorFromWindow 的值

来自分类Dev

添加两个LPCWSTR变量

来自分类Dev

使用wsprintf将int转换为LPCWSTR

来自分类Dev

将字符串解析为LPCWSTR

来自分类Dev

将(const)char *转换为LPCWSTR

来自分类Dev

如何将结构(不是结构的指针)传递给 ruby 中的 Win32API 调用?

来自分类Dev

如何为Win32 API声明变量?

来自分类Dev

C ++:将WCHAR转换为LPCWSTR-实际的工作示例

来自分类Dev

将LPCWSTR字符串打印到文件

来自分类Dev

C ++:将WCHAR转换为LPCWSTR-实际的工作示例

来自分类Dev

无法将参数1从'const char [11]'转换为'LPCWSTR'

来自分类Dev

调用API时,LPCWSTR字符串应采用哪种编码?

来自分类Dev

调用API时,LPCWSTR字符串应采用哪种编码?

来自分类Dev

Perl Win32 :: API-在与DLL函数之间来回传递数组时出现问题

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Win32 API SearchPath失败

来自分类Dev

如何禁用按钮-Win32 API

来自分类Dev

GetGuiResources WIn32 API使用

来自分类Dev

Java到Win32加密API

来自分类Dev

Win32 API 无法 CreateWindowW()

来自分类Dev

将JavaScript变量传递给php-Google+ API

来自分类Dev

将多个变量传递给 Tweepy api.update_status

来自分类Dev

如何从 AWS API 将变量传递给 Python Lambda

来自分类Dev

将LPCWSTR与另一个字符串结合

来自分类Dev

错误C2664:MessageBoxW无法将参数2从'const char'转换为'LPCWSTR'

来自分类Dev

如何制作LPCWSTR的副本?

来自分类Dev

从char转换为LPCWSTR

来自分类Dev

Qstring到LPCWSTR

来自分类Dev

wstringstream到LPCWSTR