Я использую следующий модуль для отображения и печати HTML-кода через TWebBrowser, который отображается в немодальном диалоговом окне. В моей производственной программе следующий код работает под 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-код я добавил фрагмент javascript, который отображает кнопку «печать» и добавляет событие «отпечаток». Еще раз, это отлично работает на моей машине разработки (XP), но не на моих клиентских машинах (Win7), где программа зависает с объявлением Внешнее исключение C015D00F (тот же адрес, что и раньше).
После большого количества поисков в Google я обнаружил, что код исключения C015000F вызван тем, что «деактивируемый контекст активации не является последним активированным». Что это значит для плохого программиста на Delphi?
Application
в качестве владельца формы. и сделайтеweb.Navigate
при показе формы вместо onCreate. - person kobik   schedule 29.03.2013