【发布时间】:2014-12-23 21:04:14
【问题描述】:
我从这篇文章中了解到 Window 的等效“whereis”命令: https://superuser.com/questions/21067/windows-equivalent-of-whereis
但是如何使用代码执行相同的操作?有 Windows API 吗?
【问题讨论】:
我从这篇文章中了解到 Window 的等效“whereis”命令: https://superuser.com/questions/21067/windows-equivalent-of-whereis
但是如何使用代码执行相同的操作?有 Windows API 吗?
【问题讨论】:
这个使用 Linq 的 C# 示例代码展示了如何扫描 PATH 环境变量:
static string SearchEnvPathForProgram(string filename)
{
return Environment.GetEnvironmentVariable("PATH").Split(';')
.Select(dir => Path.Combine(dir, filename))
.FirstOrDefault(path => File.Exists(path));
}
但是,如果这对您来说还不够,并且您需要模仿 Windows 内核的 CreateProcess 函数的完整行为,您必须通过添加 @HarryJohnston 的注释中列出的其他位置来扩展此函数(感谢您的评论)。
例如,folder of your current executable、current directory 或windows system directory。我想您会在 SO 上为每个问题找到相应的问题。
【讨论】:
LoadLibraryEx 后跟 GetModuleFileName 是一种选择,但它仅在您搜索的文件名包含 .exe 扩展名时才有效。
如果启用了安全 DLL 搜索模式(在现代版本的 Windows 上默认设置),您需要首先调用 SetDllDirectory,将当前目录作为参数传递。之后不要忘记致电SetDllDirectory(NULL) 以恢复默认行为。
这在多线程程序中可能不安全,因为在禁用安全搜索模式时另一个线程可能会加载 DLL。
【讨论】:
CREATE_SUSPENDED 调用CreateProcess 并从进程句柄中确定可执行文件的路径?
GetModuleFileNameEx 从进程句柄中获取路径,但我不完全确定这是否适用于尚未开始运行的进程。