【问题标题】:Start external program in it's directory在其目录中启动外部程序
【发布时间】:2016-11-24 09:49:34
【问题描述】:

我需要从我的项目中启动外部程序c:\pro\prog1.exe。外部程序的配置文件在同一目录c:\pro\prog1.ini。我愿意:

ShellExecute(NULL,L"open",L"c:\pro\prog1.exe" ,NULL,NULL,SW_SHOWDEFAULT);

程序c:\pro\prog1.exe 启动,但没有加载其配置文件c:\pro\prog1.ini。看起来我需要将 .ini 文件放在运行我的主机应用程序的同一目录中。这是不可接受的。那么,如何启动一个外部程序并让 Windows 从其目录中运行它呢?

【问题讨论】:

  • 为什么不使用 Process 类及其 ProcessStartInfo 支持类?有了它,您可以准确指定 WorkingDirectory
  • 你需要使用 CreateProcess 函数 - 这里存在参数 - LPCTSTR lpCurrentDirectory - 这正是你所需要的
  • 第5个参数是启动目录:ShellExecute(NULL, L"open", L"c:\\pro\\prog1.exe", NULL, L"c:\\pro\\", SW_SHOWDEFAULT);
  • @Barmak Shemirani 如果您发布它,我已经准备好接受您的回答。
  • 或者,如果 prog1.exe 在您的控制之下,您可以考虑改为修复它。不要让它从当前工作目录的相对路径中读取它的配置文件。相反,通过查询可执行映像的路径名来使用完全限定的路径。

标签: visual-studio winapi visual-c++ shellexecute


【解决方案1】:

ShellExecute中的第5个参数是启动目录。

或者"prog.exe" 可以使用GetModuleFileNamePathRemoveFileSpec 来查找自己的目录,如 cmets 中所建议的那样。

请注意,"c:\\Program Files""c:\\Program Files (x86)" 等某些目录需要提升访问权限才能创建/修改/删除文件(例如在安装期间)。没有提升访问权限的进程可以使用只读标志访问受保护目录中的文件。否则,如果请求写访问,Windows 会将路径重定向到不同的目录。

对于正常执行,*.exe 应使用"Documents""AppData" 文件夹来读取/写入数据。

【讨论】:

    猜你喜欢
    • 2014-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2014-07-30
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多