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;
}
Другие вопросы по тегам