我想调用这样的命令:
我正在使用此代码:
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
,输入参数无效。
答案 0 :(得分:1)
问题是您将std::string
和std::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_strSign
和strToolupdater
变量本身更改为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;