2011-11-22 225 views
1

我想使用CreateProcess從C++應用程序執行外部進程。CreateProcess忽略lpCurrentDirectory /父級工作目錄

當查找其目錄中存在的dll時,啓動的應用程序失敗。

使用Process Explorer(來自sysinternals)檢查executwd進程,顯示進程工作目錄是c:\ windows,而不是父級工作目錄。

使用lpCurrentDirectory硬編碼工作目錄也沒有幫助。

該過程確實使用系統命令正確執行qhen。

編輯 有問題的目錄不是模塊目錄,而是當前的工作目錄。

modules目錄中搜索符合市場預期,但不包含DLL (複製SL1至模塊目錄作品 - 但它山的解決方法)

+2

的Windows外觀時加載DLL就是可執行模塊從裝載目錄中的首位。如果你的DLL在那裏,那麼他們將被發現。問題顯然不是你想象的那樣。 –

回答

2

當您使用CreateProcess函數,第一個搜索目錄是包含用於創建調用過程的映像文件的目錄。這允許在不將進程的已安裝目錄添加到PATH環境變量的情況下找到與進程關聯的私有動態鏈接庫(DLL)文件。如果找不到Dll文件,系統會在系統文件夾(如system32或%windir%)中搜索這些文件。

使用SetDllDirectory函數可以更改搜索路徑。建議使用此解決方案,而不是使用SetCurrentDirectory或硬編碼DLL的完整路徑。

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

+0

如果啓動的進程正在查找資源文件而不是DLL,該怎麼辦?它似乎也從包含圖像文件的目錄開始搜索,而不是從IpCurrentDirectory或父目錄的當前目錄搜索。按照您的建議,我也嘗試了SetDllDirectory,但它沒有效果。 – Hughenot