【发布时间】:2013-03-29 12:11:48
【问题描述】:
我正在使用以下单元通过 TWebBrowser 显示 - 和打印 - HTML 代码,该 TWebBrowser 显示在非模式对话框中。在我的生产程序中,以下代码在 Windows-XP 下工作,但在 Windows-7 下失败(错误消息始终为外部异常 C015D00F)。为了隔离问题,我编写了一个简单的测试程序,它还有一个包含 TWebBrowser 的非模态对话框;就其本身而言,该测试程序可以在 Windows-7 上正常工作,但是当我将测试程序中的非模态对话框插入生产程序时,我得到了外部异常。
这大概表明调用程序而不是被调用单元有问题,但我看不出是什么问题。 HTML 代码是手工制作的,但显示正确。
可能是什么问题?打印代码来自Embarcadero site
unit Test4;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, MSHTML;
type
THTMLPreview = class(TForm)
web: TWebBrowser;
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure webDocumentComplete(Sender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
private
options: word;
fn: string;
procedure DoPrint;
public
Constructor Create (const afn, acapt: string; opts: word);
end;
implementation
{$R *.dfm}
constructor THTMLPreview.Create (const afn, acapt: string; opts: word);
begin
inherited create (nil);
caption:= acapt;
fn:= afn;
options:= opts;
web.Navigate (fn);
end;
procedure THTMLPreview.webDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
DoPrint
end;
procedure THTMLPreview.DoPrint;
var
HTMLDoc: IHTMLDocument2;
HTMLWnd: IHTMLWindow2;
HTMLWindow3: IHTMLWindow3;
begin
if options and 4 = 4 then
begin
HTMLDoc:= web.Document as IHTMLDocument2;
if HTMLDoc <> nil then
begin
HTMLWnd:= HTMLDoc.parentWindow;
HTMLWindow3:= HTMLWnd as IHTMLWindow3;
HTMLWindow3.print;
end
end
end;
procedure THTMLPreview.FormClose(Sender: TObject; var Action: TCloseAction);
begin
if options and 1 = 1 then deletefile (fn);
action:= caFree
end;
end.
使用语句Web.ControlInterface.ExecWB (OLECMDID_PRINT, OLECMDEXECOPT_PROMPTUSER,
vaIn, vaOut) 会出现同样的错误。
几天后编辑:
我尝试了一种完全不同的方法来解决这个问题。在 HTML 代码中,我添加了一个 javascript sn-p,它显示了一个“打印”按钮并添加了一个“onprint”事件。再一次,这在我的开发机器 (XP) 上运行良好,但在我的客户端机器 (Win7) 上运行良好,程序冻结并显示外部异常 C015D00F(与之前的地址相同)。
经过大量的谷歌搜索,我发现异常代码 C015000F 是由 “被停用的激活上下文不是最近激活的。”这对可怜的 Delphi 程序员意味着什么?
【问题讨论】:
-
哪一行触发了异常?以及如何关闭表格?手动?
-
@Noam,我不是反对者,但您仍然没有提供足够的信息。请解决我的评论。
-
@kobik:我认为我提供了足够多的信息。我还发布了一条评论,其中提到了您的评论,但它似乎已经消失了。我不知道“DoPrint”例程中的哪一行触发了异常,但 ControlInterface 行有完全相同的问题。表单将手动关闭,但在关闭之前崩溃。
-
@Noam,您的代码对我来说看起来不错。但是,我会提供
Application作为表单的所有者。并在表单显示上执行web.Navigate,而不是 onCreate。 -
@kobik:我按照你的建议做了,但没有任何改变。我在 DoPrint 过程的每一行之后添加了简单的日志记录语句,包括 HTMLWindow3.print 之后的一行 - 此行出现在日志中。换句话说,HTMLWindow3.print 调用了一些库代码,并且在该外部代码中发生了崩溃。
标签: delphi twebbrowser