【发布时间】:2015-04-25 17:43:46
【问题描述】:
我有一个与 Internet Explorer (IE) 相关的奇怪行为。我的目标是将报告生成为 HTML 标记并通过 Web 浏览器将其显示给用户。 (由于我的软件在我们的企业环境中使用,并且大多数默认情况下都有 IE 网络浏览器,因此我仅在 IE 中观察到此问题。)
该软件是作为基于 MFC 对话框的应用程序编写的,每天(早上 7:30)从重复的任务计划程序任务中运行。 (该任务设置为仅在用户登录时运行,始终如此。这是一个单用户帐户系统,该用户永远不会注销。这些机器也一直处于开机状态。)
在启动时,我的软件会生成 HTML 标记,将其保存在临时文件中,然后让 IE 将其显示给用户。就是这样。 (目标基本上是自动化此报告并在人们开始他们的一天时将其显示在屏幕上。)
所以我基本上使用了以下代码:
TCHAR buffTempFldr[MAX_PATH] = {0};
::GetTempPath(MAX_PATH, buffTempFldr);
StringCchCat(buffTempFldr, MAX_PATH, L"Log Report.htm");
//strHtml = CStringA with HTML markup of report in 8-bit ASCII format
HANDLE hFile = ::CreateFile(buffTempFldr, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
CREATE_ALWAYS, 0, NULL);
if(hFile != INVALID_HANDLE_VALUE)
{
DWORD dwcbWrtn;
::WriteFile(hFile, (BYTE *)strHtml.GetString(), strHtml.GetLength(), &dwcbWrtn, NULL);
::CloseHandle(hFile);
BOOL bInitted = SUCCEEDED(CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE));
//Show in Web Browser (IE by default)
int nRetSH = (int)ShellExecute(NULL, L"open", buffTempFldr, NULL, NULL, SW_SHOWNORMAL);
if(nRetSH > 32)
{
//Success
}
if(!bInitted)
CoUninitialize();
}
问题是这在大多数情况下都有效,但可能有 10% 的时间用户得到一个空的(空白)HTML 页面。只有在他们点击刷新后,页面才会显示实际的报告。
显然这让用户感到困惑,所以我想看看为什么会这样?
PS。执行此操作的计算机运行的是 Windows 7 Professional 和 IE v.11,并定期安装更新。
【问题讨论】:
-
在
CloseHandle()之前尝试FlushFileBuffers()。此外,"open"应该是NULL来执行文件的默认动词,if(!bInitted)应该是if(bInitted)。 -
@RemyLebeau:谢谢。我不确定我为什么选择
if(!bInitted)。我猜是脑子放屁;)至于FlushFileBuffers(),我认为CloseHandle()本质上就是这样做的。否则所有的操作系统缓存都没有意义。 -
快速更新。刚刚实施了您的建议,并且在前几次都有效。但是在第 3 次或第 4 次尝试时,我又得到了一个空的 IE 屏幕。所以只有在我按下 F5 后,内容才会出现。嗯...我很困惑为什么?与我手动测试它的唯一不同(没有时间表)是屏幕可能已关闭,并且屏幕保护程序之前可能已显示。这可能是个问题吗?
标签: c++ windows internet-explorer winapi mfc