0

我的应用程序通过将报告组合到一个文件中来向其最终用户显示报告,该.htm文件放置在用户的临时文件夹中(通过调用GetTempPathAPI 派生)。然后使用如下代码向用户显示:

//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 上它显示这个弹出窗口:

在此处输入图像描述

有谁知道我可以如何复制该错误?

4

1 回答 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 下。

可能还涉及其他键,您可以通过使用 SysInternals 的 Process Monitor 监视您的应用程序来了解 Windows 的位置。

于 2018-11-14T17:35:48.340 回答