Когда я использую ShellExecuteEx с такой командой "-unused parameter -action capturescreenshot -filename C:\\ATDK\\Screenshots\\abcd.jbg"
, все работает нормально, а Executor.exe начинается с char* argv[]
со всеми ок. 9 параметров. Но когда команда имеет для пары символов больше, например, имя файла «abc ... xyz.jpg», то этот процесс имеет argc == 1, и команда пуста. Итак, команда в порядке до отправки в ShellExecute. После того, как я изменил это на ShellExecute, а не Ex, он работает! Команда может быть очень длинной, и она успешно прошла. Может ли кто-нибудь объяснить, в чем разница? Вот код с SHELLEXECUTEINFO, который я заполнил.ShellExecuteEx не проходит длинную команду
std::wstringstream wss;
wss << L"-unused" << " " // added because we need to pass some info as 0 parameter
<< L"parameter" << " " // added because EU parser sucks
<< L"-action" << " "
<< L"capturescreenshot" << " "
<< L"-filename" << " "
<< L"C:\\ATDK\\Screenshots\\abc.jpg";
SHELLEXECUTEINFO shell_info;
ZeroMemory(&shell_info, sizeof(shell_info));
shell_info.cbSize = sizeof(SHELLEXECUTEINFO);
shell_info.fMask = SEE_MASK_ASYNCOK | SEE_MASK_NO_CONSOLE;
shell_info.hwnd = NULL;
shell_info.lpVerb = NULL;
shell_info.lpFile = L"C:/ATDK/Executor";
shell_info.lpParameters = (LPCWSTR)wss.str().c_str();
shell_info.lpDirectory = NULL;
shell_info.nShow = SW_MINIMIZE;
shell_info.hInstApp = NULL;
// 1
ShellExecuteEx(&shell_info);
// this sucks,
// GetLastError returns err code 2147483658,
//FormatMessage returns The data necessary to complete this operation is not yet available
// 2
ShellExecute(NULL, NULL, L"C:/ATDK/Executor", (LPCWSTR)wss.str().c_str(), NULL, NULL);
// OK!
То, что (LPCWSTR), только остановило компилятор, сообщив вам, что код был неправильным, это не помешало вам сделать это неправильно. Если вы не хотите конвертировать в строку Unicode с помощью mbstowcs() или MultiByteToWideString(), то используйте SHELLEXECUTEINFOA и ShellExecuteExA(). –
Вы также не проверяете наличие ошибок. Вы должны проверить возвращаемое значение функции. –
Возможный дубликат [странное поведение при преобразовании std :: string в LPCSTR] (http://stackoverflow.com/questions/11370536/weird-behavior-while-converting-a-stdstring-to-a-lpcstr) –