ShellExecuteW在Windows 8.1上运行不正常?

Cod*_*345 1 c++ windows winapi shellexecute windows-8.1

ShellExecuteW在Windows8.1上调用标准调用来打开PPS(powerpoint slide)文件.

这在Windows 7上运行正常.在Windows 8.1上.它报告"没有与打开文件相关的程序".当然,文件关联已设置,如果文件已保存并从资源管理器中运行(双击),则打开就可以了.我还尝试更改关联并关联另一个程序,然后关联回PPS查看器,没有任何改进.它只对W8.1不起作用,但同样的调用适用于早期的Windows.

任何人都可以告诉我这里可能有什么问题吗?

用于打开文件的代码非常简单,我发现它没有错误:

HINSTANCE hinst = ShellExecuteW(NULL, L"open", L"C:\\path\\to\\file.pps", NULL, NULL, SW_SHOWNORMAL);

// Check if result is error
if ((int)hinst <= 32)
    {
    wchar_t buf[512] = { 0 };
    FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 512, NULL);

    MSGBOX(buf);
    }
Run Code Online (Sandbox Code Playgroud)

我使用免费的PPS查看器,如下所示:http: //www.microsoft.com/en-us/download/details.aspx?id = 13

我发现类似的东西指出这可能是Win8.1中的一个错误.谁能证实这一点?或者揭示一个解决方法?

Cod*_*345 5

我自己找到了解决方案.

W8.1的问题是动词open没有注册到应用程序,所以它使用了不同的默认动词.因此,如果ShellExecute呼叫被替换为:

HINSTANCE hinst = ShellExecuteW(NULL, NULL, L"C:\\path\\to\\file.pps", NULL, NULL, SW_SHOWNORMAL);
Run Code Online (Sandbox Code Playgroud)

然后系统会查找可能会或可能不会open(通常是)的默认动词,因此,如果不明确地使用此动词,则会将此决定留给系统.

  • 是的,这种行为记录在[`ShellExecute()`文档]中(http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153.aspx):"NULL - 默认动词是如果没有,则使用`open`动词.如果两个动词都不可用,则系统使用注册表中列出的第一个动词." (2认同)
  • 我找到答案并与所有人分享,因为没有其他人回答,就像我每次在其他人之前找到答案一样.这不是我自己回答的第一个问题,有些已经上网几天了.我不能真正进入猜测模式,知道有人什么时候回答.如果您认为这是不公正而不是我想帮助社区的愿望,请随时回答您自己,我会将您的答案标记为正确. (2认同)
  • @ david.pfx:我发布了http://meta.stackexchange.com/questions/225783/whats-the-current-consensus-on-answering-your-own-question作为讨论的更合适的地方从社区获得建议. (2认同)