2016-09-08 7 views
-3

Я хочу, чтобы вызвать такую ​​команду:Некоторые задачи о функции 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, входной параметр недействителен.

+0

И что ожидаемый результат? BTW не публикует фотографии кода, а публикует код. –

+0

ожидаемым результатом является ToolUpdater.exe -i Hackeroid_Qqhcs, на самом деле реальным результатом является ToolUpdater.exe. параметр недействителен. – bai

+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 temporaril у, когда это необходимо:

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;