相对路径 .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
那样在工作目录中搜索,则使用绝对路径而不是相对路径。我怀疑这是你想要做的,但为了完整性而提到它。
在我的 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
那样在工作目录中搜索,则使用绝对路径而不是相对路径。我怀疑这是你想要做的,但为了完整性而提到它。