如何复制出现ERROR_NO_ASSOCIATION错误的ShellExecuteEx故障?

时间:2018-10-16 23:44:07

标签: c++ winapi windows-shell shellexecute shellexecuteex

我的应用程序通过将其组合到放置在用户的临时文件夹(通过调用.htm API派生)的GetTempPath文件中来向最终用户显示报告。然后将其显示为带有以下代码的用户:

//strCmd == file:///C:/Users/UserName/AppData/Local/Temp/My_Report.htm

SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(sei);
sei.fMask = SEE_MASK_FLAG_NO_UI;
sei.nShow = SW_SHOW;
sei.lpVerb = L"open";
sei.lpFile = strCmd.GetBuffer();
sei.hwnd = hParentWnd;

BOOL bInitialized = SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));

if(ShellExecuteEx(&sei))
{
    //Success
}
else
{
    //Failed
    REPORT_ERROR(GetLastError());
}

if(bInitialized)
{
    CoUninitialize();
}

我刚从一个客户那里得到一个错误报告,该错误报告表明上面的代码报告了ERROR_NO_ASSOCIATION。我从图片中获得的操作系统看起来像Windows 8.1,或者也许是Windows 7。

因此,我一直在尝试通过删除.htm.html文件扩展名的所有文件关联在VM中复制它,但是ShellExecuteEx似乎从未失败。在Windows 10上,它总是打开Edge,在Win 8.1上,它显示以下弹出窗口:

enter image description here

有人知道我如何复制该错误吗?

1 个答案:

答案 0 :(得分:0)

删除.htm [l]可能无效,因为file://是协议,因此您可能也必须删除它。

您应该尝试删除HKCR\file

这是文档所能带给您的,但默认关联选择中还包含其他未记录的键。

对于文件扩展名,您需要删除HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm(或至少删除UserChoice子项)

,对于协议,您需要删除HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\file。此密钥也可以在HKLM下存在。

可能还涉及其他键,您可以使用SysInternals的Process Monitor通过监视应用程序来找出Windows的外观。