ShellExecuteEx在Windows 8中的奇怪行为

时间:2014-01-24 23:56:52

标签: winapi visual-c++ windows-8

对于没有扩展名的文件,下面的代码会显示一个对话框,其中列出了可用于打开文件的应用程序。仅从Windows-8中可以看到此行为。对话框中列出的应用程序取自HKEY_LOCAL_MACHINE \ SOFTWARE \ Classes * \ OpenWithList。反正是否有抑制此对话框并获得类似于旧平台的行为?

-Karthik

    SHELLEXECUTEINFO shinfo;
unsigned long  mask = SEE_MASK_FLAG_NO_UI;
memset(&shinfo,0,sizeof(shinfo));
shinfo.cbSize = sizeof(shinfo);
shinfo.fMask = SEE_MASK_FLAG_DDEWAIT | mask;
shinfo.hwnd = NULL;
shinfo.lpVerb = "open";
shinfo.lpFile = prog;
shinfo.lpParameters = NULL;
shinfo.lpDirectory = 0;
shinfo.fMask = SEE_MASK_FLAG_NO_UI;
shinfo.nShow = SW_SHOWDEFAULT;

rc = ShellExecuteEx(&shinfo);

enter image description here

1 个答案:

答案 0 :(得分:0)

我怀疑在没有扩展名的文件中,Windows 8上没有与open相关联的默认操作。我在Windows 7上使用你的代码(无论如何都是Delphi版本)证实了这一点。

shinfo.lpverb设置为“打开”的代码运行导致ShellExecuteEx返回FALSE,而GetLastError确实返回ERROR_NO_ASSOCIATION。但是,将lpVerb更改为NULL(在Delphi中为nil)而不是显示标准的Win7 打开方式对话框,就像您的代码在Windows 8上一样。

以下是您的测试代码的修改版本:

SHELLEXECUTEINFO shinfo;
memset(&shinfo, 0, sizeof(shinfo));
shinfo.cbSize = sizeof(shinfo);
shinfo.fMask = SEE_MASK_FLAG_DDEWAIT | SEE_MASK_FLAG_NO_UI;
shinfo.lpVerb = NULL;
shinfo.lpFile = prog;
shinfo.hwnd = NULL; 
shinfo.lpParameters = NULL;
shinfo.lpDirectory = 0;
shinfo.nShow = SW_SHOWDEFAULT;

rc = ShellExecuteEx(&shinfo);

这是我用于比较的测试Delphi代码(C ++代码的完全翻译):

var
  shInfo: TShellExecuteInfo;

  FillChar(shInfo, SizeOf(shInfo), 0);   // Same result as memset()
  shInfo.cbSize := SizeOf(shInfo);
  shInfo.fMask := SEE_MASK_FLAG_NO_UI or SEE_MASK_FLAG_DDEWAIT;
  shInfo.Wnd := 0;                       
  shInfo.lpVerb := nil;                  // Also tested with 'open'
  shInfo.lpDirectory := 'D:\TempFiles';  // Path to my no-extension file
  shInfo.lpFile := 'datafile';           // My test file with no ext
  shInfo.nShow := SW_SHOWDEFAULT;
  if not ShellExecuteEx(@shInfo) then
    ShowMessage(SysErrorMessage(GetLastError)); // Readable error message 

快速更改代码,将“open”替换为NULL,lpVerb应该确认。

您还可以通过在Win8的资源管理器中右键单击没有扩展名的文件,并检查上下文菜单顶部的粗体默认操作,相当容易地确认我的怀疑。如果没有粗体选项,或者除了打开之外什么都没有,我的怀疑是正确的。