簡體   English   中英

將變量傳遞給WIN32 API LPCWSTR?

[英]Passing a variable to 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的新手。

問題是您正在傳遞無效的指針到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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM