Как реплицировать ошибку ShellExecuteEx с ошибкой ERROR_NO_ASSOCIATION? - PullRequest
0 голосов
/ 17 октября 2018

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

enter image description here

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

1 Ответ

0 голосов
/ 14 ноября 2018

Удаление .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.

...