相对路径 .EXE 名称上的 ::ShellExecute 和 static CFile::GetStatus() 的路径搜索顺序是否应该相同?

Should path search order be identical for ::ShellExecute and static CFile::GetStatus() on relative path .EXE name?

在我的 MFC 应用程序中,我正在做类似的事情

CFileStatus fs;
if (CFile::GetStatus("MyOtherProg.exe", fs))
  {
  // found the file
  ::ShellExecute(NULL, NULL, "MyOtherProg.exe", NULL, NULL, SW_SHOW);
  }

但是在静态 CFile::GetStatus 中找到的文件的完整路径不是 ::ShellExecute 正在执行的文件(它具有相同的名称,但是 运行ning 的不同版本"MyOtherProg.exe",在不同的文件夹中)。

我已经在具有相同 O/S(Win7 64 位)的不同 PC 上尝试过此操作,在不同的文件夹中使用不同的 "MyOtherProg.exe" 集。 PC 的 ShellExecute 运行 与 CFile::GetStatus 中的相同。一台 PC 总是 运行ning 版本 3,另一台 PC 总是 运行ning 版本 2(为什么不一致?)。

注1:在2台PC中,至少有3个版本是"installed",但其中NONE个安装在PATH中。有些确实在桌面上有快捷方式,如果这是一些未记录的功能。

注2:都是"MyOtherProg.exe"的不同版本,只是安装在不同的目录下。

注意 3:通过 ::ShellExecute 最终成为 运行 的完整路径与我在任务栏下方的搜索编辑字段中键入 "MyOtherProg.exe" 时找到的路径相同开始菜单。但是为什么 CFile::GetStatus 找到的不是同一个?为什么在一台 PC 上是版本 2,而在另一台 PC 上是版本 3?

注意4:在两台PC上,运行命令"MyOtherProg.exe"的结果搜索列表只显示1个版本(虽然在一台PC上安装了3个版本,而在另一台PC上安装了4个安装了不同的版本,第五个版本是 "debug" 构建)。有 3 个版本的 PC 总是只列出版本 2,有 5 个版本的 PC 总是只列出版本 3.

  • CFile::GetStatus 扩展与工作目录的相对路径。
  • ShellExecute 使用进程创建搜索顺序查找文件。 CreateProcess 文档中对此进行了描述。除了此处列出的路径外,还会搜索每个应用程序的路径。

简而言之,这意味着仅 CFile::GetStatus 根本不适合您要完成的任务。您必须重新创建 shell 搜索。

但是你为什么要那样做?合乎逻辑的做法是直接调用 ShellExecute 并检查错误。让它执行搜索,因为它知道规则。由于 ShellExecute 的错误报告不足,您应该调用 ShellExecuteEx

另一方面,如果您只想像当前调用 CFile::GetStatus 那样在工作目录中搜索,则使用绝对路径而不是相对路径。我怀疑这是你想要做的,但为了完整性而提到它。