我的应用程序通过将其组合到放置在用户的临时文件夹(通过调用.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上,它显示以下弹出窗口:
有人知道我如何复制该错误吗?
答案 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的外观。