我正在使用以下單元通過顯示在非模式對話框中的TWebBrowser顯示 - 和打印 - HTML代碼。在我的生產程序中,以下代碼在Windows-XP下運行,但在Windows-7下運行失敗(錯誤消息總是外部異常C015D00F)。爲了解決這個問題,我編寫了一個簡單的測試程序,它也有一個非模態對話框,其中包含一個TWebBrowser;就其本身而言,這個測試程序可以與Windows-7正常工作,但是當我將測試程序中的非模態對話框插入生產程序時,我會得到外部異常。從TWebBrowser打印
這大概表明調用程序有問題,而不是被調用單元,但我看不出有什麼問題。 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代碼中,我添加了一個顯示「打印」按鈕並添加了「onprint」事件的JavaScript片段。再一次,這在我的開發機器(XP)上可以正常工作,但在我的客戶機器(Win7)上卻不能正常工作,程序因聲明外部異常C015D00F(與以前地址相同)而凍結。
谷歌搜索不小的量之後,我發現了異常代碼C015000F由 造成「被停用的激活上下文不是最近激活之一。」這對窮人的Delphi程序員意味着什麼?
什麼行觸發異常?你如何關閉表格?手動? – kobik
爲什麼downvotes? –
@Noam,我不是低調的選民,但你仍然沒有提供足夠的信息。請寫下我的評論。 – kobik