ShellExecuteW在Windows 8.1上运行不正常?

时间:2014-03-15 14:05:03

标签: c++ windows winapi windows-8.1 shellexecute

我在Windows8.1上调用标准ShellExecuteW来打开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);
    }

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

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

1 个答案:

答案 0 :(得分:5)

我自己找到了解决方案。

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

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

然后系统会查找一个默认动词,该动词可能是open(通常是),也可能不是{{1}},因此,如果不明确使用此动词,则会将此决定留给系统。