CreateProcess игнорирует рабочий каталог lpCurrentDirectory / parent - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь использовать CreateProcess для запуска внешнего процесса из приложения c ++.

Запущенное приложение завершается ошибкой при поиске DLL, которые существуют в его каталоге.

Проверка процесса executwd в Process Explorer (из sysinternals) показывает, что рабочим каталогом процесса является c: \ windows, а не родительский рабочий каталог.

Использование lpCurrentDirectory для жесткого кода рабочего каталога также не помогает.

Процесс выполняется правильно qhen с помощью системной команды.

EDIT Проблемным каталогом является не каталог модуля, а текущий рабочий каталог.

Каталог модулей ищется, как и ожидалось, но не содержит DLL (Копирование sll в каталог модуля работает, но это обходной путь)

1 Ответ

2 голосов
/ 22 ноября 2011

Когда вы используете функцию CreateProcess, первый искомый каталог - это каталог, содержащий файл изображения, используемый для создания вызывающего процесса. Это позволяет находить файлы динамической библиотеки (DLL), связанные с процессом, без добавления установленного процесса каталог переменной среды PATH. Если файлы Dll не найдены, система выполняет поиск этих файлов в системных папках, таких как system32 или% windir%.

Путь поиска можно изменить с помощью функции SetDllDirectory. Это решение рекомендуется вместо использования SetCurrentDirectory или жесткого кодирования полного пути к DLL.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682600%28v=vs.85%29.aspx

...