【问题标题】:How to programmatically determine the PATH for a command? [closed]如何以编程方式确定命令的 PATH? [关闭]
【发布时间】:2014-12-23 21:04:14
【问题描述】:

我从这篇文章中了解到 Window 的等效“whereis”命令: https://superuser.com/questions/21067/windows-equivalent-of-whereis

但是如何使用代码执行相同的操作?有 Windows API 吗?

【问题讨论】:

标签: windows api


【解决方案1】:

这个使用 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 executablecurrent directorywindows system directory。我想您会在 SO 上为每个问题找到相应的问题。

【讨论】:

  • Windows使用的算法比较复杂;例如,首先检查应用程序目录,然后检查当前目录。路径位于列表的底部,排在第六位。 documentation for CreateProcess 中的完整详细信息。
【解决方案2】:

LoadLibraryEx 后跟 GetModuleFileName 是一种选择,但它仅在您搜索的文件名包含 .exe 扩展名时才有效。

如果启用了安全 DLL 搜索模式(在现代版本的 Windows 上默认设置),您需要首先调用 SetDllDirectory,将当前目录作为参数传递。之后不要忘记致电SetDllDirectory(NULL) 以恢复默认行为。

这在多线程程序中可能不安全,因为在禁用安全搜索模式时另一个线程可能会加载 DLL。

【讨论】:

  • 是否可以用CREATE_SUSPENDED 调用CreateProcess 并从进程句柄中确定可执行文件的路径?
  • 嗯……也许吧。您可以使用GetModuleFileNameEx 从进程句柄中获取路径,但我不完全确定这是否适用于尚未开始运行的进程。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2010-12-16
  • 2011-07-15
  • 2015-11-26
  • 2020-07-08
  • 2013-07-04
  • 2010-11-17
相关资源
最近更新 更多