【问题标题】:CreateProcess ignores lpCurrentDirectory / parent working directoryCreateProcess 忽略 lpCurrentDirectory / 父工作目录
【发布时间】:2011-11-22 09:07:12
【问题描述】:

我正在尝试使用 CreateProcess 从 c++ 应用程序执行外部进程。

在查找其目录中存在的 dll 时,启动的应用程序失败。

使用 Process Explorer(来自 sysinternals)检查 executwd 进程显示进程工作目录是 c:\windows,而不是父工作目录。

使用 lpCurrentDirectory 对工作目录进行硬编码也无济于事。

使用系统命令,进程确实正确执行。

编辑 有问题的目录不是模块目录,而是当前工作目录。

模块目录按预期搜索,但不包含 dll (将 sll 复制到模块目录有效 - 但它是一种解决方法)

【问题讨论】:

  • Windows 在加载 DLL 时首先查看的位置是加载可执行模块的目录。如果您的 DLL 在那里,那么它们将被找到。问题显然不是你想的那样。

标签: c++ winapi createprocess


【解决方案1】:

当您使用 CreateProcess 函数时,搜索的第一个目录是包含用于创建调用进程的图像文件的目录。这允许在不添加进程安装的情况下找到与进程关联的私有动态链接库 (DLL) 文件目录到 PATH 环境变量。如果找不到dll文件,系统会在系统文件夹中搜索这些文件,例如system32或%windir%。

可以使用 SetDllDirectory 函数更改搜索路径。建议使用此解决方案,而不是使用 SetCurrentDirectory 或硬编码 DLL 的完整路径。

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

【讨论】:

  • 如果启动的进程正在寻找资源文件,而不是 DLL 怎么办?它似乎也从包含图像文件的目录开始搜索,而不是从 IpCurrentDirectory 或父级的当前目录开始。我也按照您的建议尝试了 SetDllDirectory,但没有效果。
猜你喜欢
  • 1970-01-01
  • 2013-06-28
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 2012-07-15
  • 1970-01-01
  • 2017-06-14
  • 1970-01-01
相关资源
最近更新 更多