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

时间:2015-03-09 02:23:48

标签: c++ winapi mfc shellexecute cfile

在我的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&# 34;,在另一个文件夹中。)

我在具有相同O / S(Win7 64位)的不同PC上尝试过这种方法,使用不同的" MyOtherProg.exe"在各种文件夹中。 PC的ShellExecute都没有运行与CFile :: GetStatus中相同的ShellExecute。一台PC总是运行第3版,另一台PC总是运行第2版(为什么这不是一致的?)。

注1:在2台PC中,至少有3个版本已安装"但是其中没有安装在PATH中。有些人在桌面上有SHORTCUTS,如果这是一些未记录的功能。

注意2:所有这些版本都是" MyOtherProg.exe"的不同版本,但安装在不同的目录中。

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

注意4:在两台PC上,生成的RUN命令搜索列表" MyOtherProg.exe"仅显示1个版本(虽然在一台PC上安装了3个版本,而在另一台PC上安装了4个不同版本,第五个版本是" debug" build)。具有3个版本的PC始终仅列出版本2,具有5个版本的PC始终仅列出版本3.

1 个答案:

答案 0 :(得分:0)

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

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

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

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