CreateProcessW не соблюдает командную строку
Я пытаюсь реализовать CreateProcessW в DLL, чтобы пользователь мог запустить приложение в отдельном процессе.
Для начала я жестко кодирую команды в коде, пока не выясню это..
у меня есть
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
}
Это запустит Зависит, но не откроет Tee.exe. Там нет ошибки, он просто игнорирует параметр командной строки. Параметры верны, и я могу запустить его в командной строке, и он работает нормально. Если я оставлю AppName пустым и укажу Depends.exe в качестве параметра Command, он также будет работать, но если я укажу
LPTSTR Command = L"c:\\utilities\\depends.exe c:\\utilities\\tee.exe";
Я получаю ошибку 3: "Система не может найти указанный путь".
Кроме того, указав параметр lpCurrentDirectory, он также игнорируется.
1 ответ
Вы должны предоставить исполняемый файл в command
Appname
должен содержать полный путь к исполняемому файлуCommand
должен содержать такжеargv[0]
если вы хотите открыть файл t.txt
с помощью блокнота, чем вы можете дать следующее:
Appname = "c:/windows/notepad.exe";
command = "notepad c:/temp/t.txt";
Вам даже не нужно указывать реальное имя программы, даже поддельное имя сделает эту работу, так как это только заполнитель.
как это: command = "fake c:/temp/t.txt";
сейчас в notepad.exe:
argv[0] = "notepad";
argv[1] = "c:/temp/t.txt";
Смотрите этот полный пример:
#include <Windows.h>
#include <iostream>
using namespace std;
int main(){
STARTUPINFO si = {sizeof(STARTUPINFO), 0};
si.cb = sizeof(si);
PROCESS_INFORMATION pi = {0};
LPTSTR AppName=L"C:/Windows/notepad.exe";
wchar_t Command[] = L"notepad C:/Temp/t.txt";
DWORD res = CreateProcess(AppName, Command, 0, 0, 0, CREATE_DEFAULT_ERROR_MODE, 0, 0, &si, &pi);
if (res) {
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
} else {
cerr<<"error..."<<GetLastError()<<endl;
};
return 0;
}