代码之家  ›  专栏  ›  技术社区  ›  c00000fd

如何复制ShellExecuteEx失败并出现错误“无”关联错误?

  •  0
  • c00000fd  · 技术社区  · 7 年前

    我的应用程序通过将报表组合到 .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();
    }
    

    我刚收到一个客户的bug报告,上面的代码报告了 ERROR_NO_ASSOCIATION . 我看到的图片中的操作系统看起来像Windows8.1,或者Windows7。

    我一直在试图删除虚拟机中的所有关联 .htm .html 文件扩展名,但是 ShellExecuteEx 似乎从不失败。在Windows 10上,它总是打开Edge,而在Win 8.1上,它显示以下弹出窗口:

    enter image description here

    有人知道我如何复制这个错误吗?

    1 回复  |  直到 7 年前
        1
  •  0
  •   Anders    7 年前

    删除.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

    可能还涉及其他密钥,您可以通过从SysInternals使用Process Monitor监视应用程序来找到Windows的位置。

    推荐文章