0

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

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

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

我已经在具有相同操作系统(Win7 64 位)的不同 PC 上尝试过这个,在不同的文件夹中有不同的“MyOtherProg.exe”集。两台 PC 的 ShellExecute 运行的都与 CFile::GetStatus 中的相同。一台 PC 总是运行版本 3,另一台 PC 总是运行版本 2(为什么不一致?)。

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

注2:它们都是“MyOtherProg.exe”的不同版本,但安装在不同的目录中。

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

注 4:在两台 PC 上,运行命令“MyOtherProg.exe”的搜索结果列表仅显示 1 个版本(尽管在一台 PC 上安装了 3 个版本,而在另一台 PC 上安装了 4 个不同版本,其中第五个是“调试”构建)。具有 3 个版本的 PC 始终仅列出版本 2,具有 5 个版本的 PC 始终仅列出版本 3。

4

1 回答 1

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

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

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

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

于 2015-03-09T07:29:45.877 回答