Я пытаюсь реализовать CreateProcessW в DLL, чтобы пользователь мог запустить приложение в отдельном процессе.CreateProcessW не выполняет командную строку
Для начала я жестко прописывать команды в коде, пока я не понять это ..
У меня
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPCTSTR AppName=L"c:\\utilities\\depends.exe";
LPTSTR Command = L"c:\\utilities\\tee.exe";
if (CreateProcessW(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi)) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return GX_RESULT_OK;
} else {
.. show error msg
}
Это запустит Depends, но не откроет Tee.exe. Нет ошибки, она просто игнорирует параметр командной строки. Параметры верны, и я могу запустить его в командной строке, и он работает нормально. Если я оставлю AppName пустым и задайте Depends.exe в качестве параметра командной строки также работает, но если я указываю
LPTSTR Command = L"c:\\utilities\\depends.exe c:\\utilities\\tee.exe";
Я получаю Ошибка 3: «Система не может найти указанный путь».
Также, указав параметр lpCurrentDirectory, он также игнорируется.
Мой хрустальный шар говорит, что вы обфускали свой код, а реальный путь - не c: \ utilities. Но тот, у которого есть пробелы в имени пути. Это требует, чтобы вы добавляли двойные кавычки по пути, чтобы он не анализировался в несколько аргументов командной строки. –
@HansPassant извините, но ваш шар затуманился! Я специально выбрал путь без пробелов, чтобы устранить эту потенциальную проблему. – marcp
Хорошо, следующая проблема - это второй аргумент. Обратите внимание, что это LPTSTR, а не LPCTSTR. Другими словами, CreateProcess должен иметь возможность записывать в этот строковый буфер. Он не может с вашей стороны, вы передали литерал. Это определенно одна из самых блестящих функций winapi, вместо этого вы должны использовать ShellExecuteEx(). –