2016-09-08 7 views
-3

私はこのようなコマンドを実行します:いくつかの問題

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を実行している場合、入力パラメータは無効です。

+0

そして、何が期待された結果でしょうか? BTWはコードの写真を投稿しませんが、コードを投稿します。 –

+0

予想される結果はToolUpdater.exe -i Hackeroid_Qqhcsです。実際の結果はToolUpdater.exeです。パラメータは無効です。 – bai

+0

あなたの質問を更新してください、それはここに立つので、それは完全に不明です。 –

答えて

1

問題は、std::stringstd::wstringのデータを混在させているため、間違っていることです。

std::wstringstreamoperator<<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; 
関連する問題