2012-03-16 3 views
2

Я пытаюсь запустить процесс из другого процесса. Механизм, в котором это достигается, не подлежит изменению. Как пусковая установка, так и исходный процесс находятся в C:\dir.CreateProcess из процесса, запущенного из файла `cmd`

Я запускаю свою пусковую установку из файла cmd. cmd сам файл находится в другом месте, и для того, чтобы найти пусковой исполняемый файл, я устанавливаю PATH переменную:

set PATH=C:\dir;%PATH%; 
launcher.exe 

пусковые запускают дочерний процесс с помощью следующего кода:

STARTUPINFO startupInfo; 
    startupInfo.cb    = sizeof (STARTUPINFO); 
    startupInfo.lpReserved  = 0; 
    startupInfo.lpDesktop  = NULL; 
    startupInfo.lpTitle   = NULL; 
    startupInfo.dwX    = 0; 
    startupInfo.dwY    = 0; 
    startupInfo.dwXSize   = 0; 
    startupInfo.dwYSize   = 0; 
    startupInfo.dwXCountChars = 0; 
    startupInfo.dwYCountChars = 0; 
    startupInfo.dwFillAttribute = 0; 
    startupInfo.dwFlags   = _showInForeground ? STARTF_USESHOWWINDOW : 0; 
    startupInfo.wShowWindow  = _showInForeground ? 1 : 0; 
    startupInfo.cbReserved2  = 0; 
    startupInfo.lpReserved2  = 0; 

    PROCESS_INFORMATION processInfo; 

    BOOL retVal = CreateProcess("child.exe", "", NULL, NULL, FALSE, 
        _showInForeground ? (CREATE_NEW_CONSOLE | CREATE_DEFAULT_ERROR_MODE) : CREATE_DEFAULT_ERROR_MODE, 
        NULL, NULL, &startupInfo,&processInfo); 

Он возвращает 0, а последняя ошибка 2, что составляет File not found.

Если это помогает, GetCurrentDirectory возвращает каталог, в котором находится cmd, а не C:\dir. Я предполагаю, что CreateProcess не может найти child.exe, потому что PATH недоступен.

Любые идеи, как заставить это работать?

EDIT: Некоторые хорошие комментарии с ответами (а комментарии иногда забывают):

Предложение: установить statupInfo.lpDirectory в "C: \ реж"

Ответ: не может. Я начинаю с cmd, потому что каталог может измениться.

+2

set statupInfo.lpDirectory to "c: \\ dir" – Lucian

+0

@ Люциан не может. Я начинаю с 'cmd', потому что каталог может измениться. –

+0

Зачем смешивать с переменной PATH? Если файл cmd знает местоположение исполняемого файла, который должен быть запущен, почему бы не передать путь к исполняемому файлу в качестве параметра вашей пусковой установки в командной строке? 'launcher.exe c: \ dir \ child.exe' – WaffleSouffle

ответ

6

Согласно MSDN, CreateProcess фактически делает поиска PATH, но только если lpApplicationName является NULL и исполняемый файл является первым лексема lpCommandLine.
Другими словами, он должен работать, если вы звоните CreateProcess(NULL, "child.exe", ...

Я не пробовал, хотя, так YMMV и так далее.

+0

Это сработало, спасибо. –

0

Процесс запуска может получить свой собственный путь, используя GetModuleFileName(), который он может использовать для создания полного пути к второму исполняемому файлу. Нет необходимости изменять переменную окружения Path или изменять рабочую прямую.

+0

Эти два не обязательно находятся в одном каталоге. Они находятся в каталогах, установленных в PATH по сценарию. –

+0

Вы сказали, что они «Как пусковая установка, так и исходный процесс находятся в C: \ dir» – Deanna

+0

Простите, что. Они сейчас, но это не обязательно. –

Смежные вопросы