我知道窗口等效的「where is」命令,從這篇文章: https://superuser.com/questions/21067/windows-equivalent-of-whereis如何以編程方式確定命令的PATH?
但一個人如何進行使用代碼一樣嗎?有沒有Windows API?
我知道窗口等效的「where is」命令,從這篇文章: https://superuser.com/questions/21067/windows-equivalent-of-whereis如何以編程方式確定命令的PATH?
但一個人如何進行使用代碼一樣嗎?有沒有Windows API?
在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 directory或windows system directory。我想你會發現每個人都有一個相應的問題在這裏。
Windows使用的算法比較複雜;例如,首先檢查應用程序目錄,然後檢查當前目錄。該路徑位於列表的底部,排在第六位。 [有關CreateProcess的文檔](http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v = vs.85).aspx)中的完整詳細信息。 –
LoadLibraryEx
其次是GetModuleFileName
是一種選擇,但它只有在您搜索的文件名包括.exe
擴展名時纔有效。
如果安全的DLL搜索模式已啓用(在現代Windows版本中默認爲默認模式),您需要首先調用SetDllDirectory
,將當前目錄作爲參數傳遞。之後不要忘記撥打SetDllDirectory(NULL)
以恢復默認行爲。
這可能在多線程程序中不安全,因爲另一個線程可能會在安全搜索模式禁用時加載DLL。
是否可以用'CREATE_SUSPENDED'調用'CreateProcess'並確定從進程句柄到可執行文件的路徑? –
呃......也許吧。您可以使用'GetModuleFileNameEx'從流程句柄中獲取路徑,但我不完全確定這是否可以在尚未開始運行的流程中使用。 –
在哪種編程語言? –
http://pinvoke.net/default.aspx/kernel32/SearchPath.html –