2014-12-23 71 views

回答

2

在C#示例代碼,使用LINQ,展示瞭如何掃描PATH環境變量:

static string SearchEnvPathForProgram(string filename) 
    { 
     return Environment.GetEnvironmentVariable("PATH").Split(';') 
       .Select(dir => Path.Combine(dir, filename)) 
       .FirstOrDefault(path => File.Exists(path)); 
    } 

但是,如果這是不夠的,你,你需要模仿CreateProcess的完整行爲Windows內核的功能,你必須通過添加@HarryJohnston評論中列出的其他地方來擴展此功能(感謝評論)。

例如,folder of your current executable,current directorywindows system directory。我想你會發現每個人都有一個相應的問題在這裏。

+0

Windows使用的算法比較複雜;例如,首先檢查應用程序目錄,然後檢查當前目錄。該路徑位於列表的底部,排在第六位。 [有關CreateProcess的文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v = vs.85).aspx)中的完整詳細信息。 –

0

LoadLibraryEx其次是GetModuleFileName是一種選擇,但它只有在您搜索的文件名包括.exe擴展名時纔有效。

如果安全的DLL搜索模式已啓用(在現代Windows版本中默認爲默認模式),您需要首先調用SetDllDirectory,將當前目錄作爲參數傳遞。之後不要忘記撥打SetDllDirectory(NULL)以恢復默認行爲。

這可能在多線程程序中不安全,因爲另一個線程可能會在安全搜索模式禁用時加載DLL。

+0

是否可以用'CREATE_SUSPENDED'調用'CreateProcess'並確定從進程句柄到可執行文件的路徑? –

+0

呃......也許吧。您可以使用'GetModuleFileNameEx'從流程句柄中獲取路徑,但我不完全確定這是否可以在尚未開始運行的流程中使用。 –

相關問題