关于ShellExecute函数的一些问题

时间:2016-09-08 06:38:14

标签: winapi mfc shellexecute

我想调用这样的命令:

image

我正在使用此代码:

 std::string szArg = " -i " + m_strSign;
 wstringstream wss;
 wss<<szArg.c_str();
 wstringstream wssa;
 wssa<<strToolupdater.c_str();
 ShellExecute(NULL,TEXT("open"), wssa.str().c_str(), wss.str().c_str(),TEXT(""),SW_NORMAL);
 wcout<<wssa.str().c_str()<<wss.str().c_str()<<endl;

预期结果是执行ToolUpdater.exe -i Hackeroid_Qqhcs,但实际结果是执行ToolUpdater.exe,输入参数无效。

1 个答案:

答案 0 :(得分:1)

问题是您将std::stringstd::wstring数据混合在一起,并且这样做不正确。

std::wstringstream没有operator<<输入char*,因此您实际上是在为operator<<输入调用void*。该运算符格式化指针本身的值,而不是它指向的数据。所以你最终将错误的输入传递给ToolUpdater.exe

如果你没有使用c_str()那么,你会在编译时发现这个错误。除非您确实需要原始字符指针(如c_str()参数中),否则请勿使用ShellExecute()。如果您避免使用原始指针,编译器可以为您执行更好的类型安全验证:

std::string szArg = " -i " + m_strSign;
std::wstringstream wss;
wss << szArg; // ERROR!
std::wstringstream wssa;
wssa << strToolupdater; // ERROR!
ShellExecute(NULL, TEXT("open"), wssa.str().c_str(), wss.str().c_str(), TEXT(""), SW_NORMAL);
std::wcout << wssa.str() << wss.str() << std::endl;

话虽如此,在这个例子中你真的不需要std::wstringstream个对象,你可以完全删除它们。

如果您拨打ShellExecuteA(),则可以将std::string值传递给它:

std::string szArg = "-i " + m_strSign;
ShellExecuteA(NULL, "open", strToolupdater.c_str(), szArg.c_str(), NULL, SW_NORMAL);
std::cout << strToolupdater << " " << szArg << std::endl;

或者,如果您将所有内容更改为std::wstring

std::wstring szArg = L"-i " + m_strSign;
ShellExecuteW(NULL, L"open", strToolupdater.c_str(), szArg.c_str(), NULL, SW_NORMAL);
std::wcout << strToolupdater << L" " << szArg << std::endl;

如果您无法将m_strSignstrToolupdater变量本身更改为std::wstring(因为其他代码仍需要std::string),您可以将它们转换为std::wstring暂时需要时:

std::wstring toWStr(const std::string &s)
{
    std::wstring ret;
    int len = MultiByteToWideChar(0, 0, s.c_str(), s.length(), NULL, 0);
    if (len > 0)
    {
        ret.resize(len);
        MultiByteToWideChar(0, 0, s.c_str(), s.length(), &ret[0], len);
    }
    return ret;
}

std::wstring szToolUpdater = toWStr(strToolupdater);
std::wstring szArg = L"-i " + toWStr(m_strSign);
ShellExecuteW(NULL, L"open", szToolUpdater.c_str(), szArg.c_str(), NULL, SW_NORMAL);
std::wcout << szToolUpdater << L" " << szArg << std::endl;