How to replicate ShellExecuteEx failure with ERROR_NO_ASSOCIATION error?

放肆的年华 提交于 2019-12-13 02:58:04

问题


My application displays a report to its end-users by composing it into an .htm file that is placed into a user's temp folder (that is derived by calling GetTempPath API). It is then shown to the user with the code as such:

//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();
}

I just got a bug report from a customer that shows that the code above reports ERROR_NO_ASSOCIATION. The OS from the picture I got looks like Windows 8.1, or maybe Windows 7.

So I've been trying to replicate it in a VM by removing all file associations for the .htm and .html file extensions, but ShellExecuteEx never seems to fail. On Windows 10 it always opens up Edge and on Win 8.1 it showed this popup:

Does anyone know how I can replicate that error?


回答1:


Removing .htm[l] probably has no effect because file:// is a protocol so you probably have to remove it as well.

You should try to remove HKCR\file.

This is as far as the documentation can take you but there are other undocumented keys involved in the default association selection.

For file extensions you need to remove HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.htm (or as a minimum, the UserChoice subkey)

and for protocols you need to remove HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\file. This key can exist under HKLM as well.

There might be other keys involved, you can find out where Windows looks by monitoring your application with Process Monitor from SysInternals.



来源:https://stackoverflow.com/questions/52845413/how-to-replicate-shellexecuteex-failure-with-error-no-association-error

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!