Мое приложение отображает отчет для своих конечных пользователей, составляя его в виде .htm
файл, который помещается во временную папку пользователя (который получается путем вызова GetTempPath
API). Затем он показывается пользователю с таким кодом:
//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
расширения файлов, но ShellExecuteEx
кажется, никогда не подведет. В Windows 10 он всегда открывает Edge, а в Win 8.1 он показывает это всплывающее окно:
Кто-нибудь знает, как я могу повторить эту ошибку?
Удаление .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.
Там могут быть и другие ключи, вы можете узнать, куда смотрит Windows, наблюдая за вашим приложением с помощью Process Monitor из SysInternals.
Других решений пока нет …