Как реплицировать ошибку ShellExecuteEx с ошибкой ERROR_NO_ASSOCIATION?

Мое приложение отображает отчет для своих конечных пользователей, составляя его в виде .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 он показывает это всплывающее окно:

введите описание изображения здесь

Кто-нибудь знает, как я могу повторить эту ошибку?

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.

Там могут быть и другие ключи, вы можете узнать, куда смотрит Windows, наблюдая за вашим приложением с помощью Process Monitor из SysInternals.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]