自动生成 HTML 文件并尝试在 IE 中打开它有时会显示空白页
Auto-generating HTML file & trying to open it in IE sometimes shows a blank page
我有一个与 Internet Explorer (IE) 相关的奇怪行为。我的目标是生成一个报告作为 HTML 标记并通过网络浏览器将其显示给用户。 (由于我的软件是在我们的公司环境中使用的,而且大多数软件默认都有 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。执行此操作的计算机是 运行ning Windows 7 Professional 和 IE v.11,并定期安装更新。
我可能已经弄清楚了。
这看起来像是 IE 11 渲染引擎中的错误。 (有趣的是,我 运行 它在装有 IE 8 的机器上运行良好。)这是我偶然发现的。当 IE 显示一个空白页面时,如果我稍微调整其 window 的大小,我的 HTML 标记就会立即绘制出来。这似乎也只有当我 运行 我的页面通过 IE 并且屏幕在省电模式下关闭时才会发生(尽管也许 运行ning 屏幕保护程序也这样做——我还没有完全完成测试它。)
所以目前我选择使用以下 "hack" 在调用 ShellExecute 方法之前唤醒屏幕:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)-1);
::Sleep(500);
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
ShellExecute(NULL, NULL, strSaveFileTo, NULL, NULL, SW_SHOWNORMAL);
但我强烈建议不要使用它,因为它会产生竞争条件,或者换句话说,无法知道先发生什么,屏幕被唤醒或正在显示的 IE 页面。
作为一种可行的解决方案,尽管可以考虑使用不同的 Web 浏览器,例如 Google Chrome 或 Firefox,它们不会出现此问题。
我有一个与 Internet Explorer (IE) 相关的奇怪行为。我的目标是生成一个报告作为 HTML 标记并通过网络浏览器将其显示给用户。 (由于我的软件是在我们的公司环境中使用的,而且大多数软件默认都有 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。执行此操作的计算机是 运行ning Windows 7 Professional 和 IE v.11,并定期安装更新。
我可能已经弄清楚了。
这看起来像是 IE 11 渲染引擎中的错误。 (有趣的是,我 运行 它在装有 IE 8 的机器上运行良好。)这是我偶然发现的。当 IE 显示一个空白页面时,如果我稍微调整其 window 的大小,我的 HTML 标记就会立即绘制出来。这似乎也只有当我 运行 我的页面通过 IE 并且屏幕在省电模式下关闭时才会发生(尽管也许 运行ning 屏幕保护程序也这样做——我还没有完全完成测试它。)
所以目前我选择使用以下 "hack" 在调用 ShellExecute 方法之前唤醒屏幕:
SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, (LPARAM)-1);
::Sleep(500);
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);
ShellExecute(NULL, NULL, strSaveFileTo, NULL, NULL, SW_SHOWNORMAL);
但我强烈建议不要使用它,因为它会产生竞争条件,或者换句话说,无法知道先发生什么,屏幕被唤醒或正在显示的 IE 页面。
作为一种可行的解决方案,尽管可以考虑使用不同的 Web 浏览器,例如 Google Chrome 或 Firefox,它们不会出现此问题。