次のユニットを使用して、非モーダル ダイアログに表示される TWebBrowser を介して HTML コードを表示および印刷しています。私の製品プログラムでは、次のコードは Windows-XP では機能しますが、Windows-7 では失敗します (エラー メッセージは常に外部例外 C015D00F です)。問題を特定するために、TWebBrowser を含む非モーダル ダイアログを含む簡単なテスト プログラムを作成しました。このテスト プログラムは、単独では Windows-7 で正しく動作しますが、非モーダル ダイアログをテスト プログラムから実稼働プログラムにプラグインすると、外部例外が発生します。
これはおそらく、呼び出されたユニットではなく、呼び出し元のプログラムに問題があることを示していますが、その問題が何であるかはわかりません。HTML コードは手作りですが、正しく表示されます。
何が問題なのですか?印刷コードは Embarcaderoサイトから取得します
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 プログラマーにとって何を意味するのでしょうか?