問題は、std::string
とstd::wstring
のデータを混在させているため、間違っていることです。
std::wstringstream
はoperator<<
char*
の入力を持っていないので、あなたはなく、実際にそのoperator<<
void*
のための入力を呼び出しています。その演算子は、ポインターのデータを指すのではなく、ポインター自体の値をフォーマットします。だから、悪い入力をToolUpdater.exe
に渡すことになります。
c_str()
をあまり使用していないと、コンパイル時にこのエラーが発生します。実際に生の文字ポインタが必要でない限り(ShellExecute()
のパラメータのように)、c_str()
を使用しないでください。あなたは生のポインタを避ける場合は、コンパイラはあなたのためのより良いタイプセーフ検証を行うことができます。
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
値を渡すことができます:あなたはm_strSign
を変更できない場合
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;
:
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
にすべてを変更した場合strToolupdater
変数自体はstd::wstring
になります(他のコードではまだstd::string
が予測されるため)std::wstring
temporaril Y、必要なとき:
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;
そして、何が期待された結果でしょうか? BTWはコードの写真を投稿しませんが、コードを投稿します。 –
予想される結果はToolUpdater.exe -i Hackeroid_Qqhcsです。実際の結果はToolUpdater.exeです。パラメータは無効です。 – bai
あなたの質問を更新してください、それはここに立つので、それは完全に不明です。 –