Проблема в том, что вы смешиваете данные 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;
И что ожидаемый результат? BTW не публикует фотографии кода, а публикует код. –
ожидаемым результатом является ToolUpdater.exe -i Hackeroid_Qqhcs, на самом деле реальным результатом является ToolUpdater.exe. параметр недействителен. – bai
Обновите свой вопрос, пожалуйста, поскольку он стоит здесь, это совершенно неясно. –