在我的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.
答案 0 :(得分:0)
CFile::GetStatus
扩展工作目录的相对路径。 ShellExecute
使用流程创建搜索顺序查找文件。这在CreateProcess
文档中有所描述。除了列出的路径外,还会搜索每个应用程序的路径。 简而言之,这意味着仅CFile::GetStatus
根本不适合您的任务。您必须重新创建shell搜索。
但你为什么要那样做?合乎逻辑的是直接调用ShellExecute
并检查错误。让它执行搜索,因为它知道规则。由于ShellExecute
有错误报告,因此您应该致电ShellExecuteEx
。
另一方面,如果您只想在工作目录中搜索当前对CFile::GetStatus
的调用,那么请使用绝对路径而不是相对路径。我怀疑这是你想要做的,但提到完整性。