Мастера, помогите.
Работаю в Word через OLE.
var
W: OleVariant;
W := CreateOleObject( 'Word.Document' );
Возникла необходимость подключиться к событиям ворда. Для этого решил использовать модуль
SinkObject от
Binh Ly.
Сделал от него наследника
TWordSink = class(TBaseSink)
private
protected
function DoInvoke (DispID: Integer; const IID: TGUID; LocaleID: Integer;
Flags: Word; var dps : TDispParams; pDispIds : PDispIdList;
VarResult, ExcepInfo, ArgErr: Pointer): HResult; override;
public
constructor Create; virtual;
constructor CreateConnected(pSource : IUnknown); virtual;
end;
constructor TWordSink.Create;
begin
inherited Create;
FSinkIID := DocumentEvents;
end;
constructor TWordSink.CreateConnected(pSource: IInterface);
begin
Create;
Connect( pSource );
end;
function TWordSink.DoInvoke(DispID: Integer; const IID: TGUID;
LocaleID: Integer; Flags: Word; var dps: TDispParams; pDispIds: PDispIdList;
VarResult, ExcepInfo, ArgErr: Pointer): HResult;
begin
Result := DISP_E_MEMBERNOTFOUND;
case DispId of
4: ShowMessage( 'Document New' );
5: ShowMessage( 'Document Open' );
6: ShowMessage( 'Document Close' );
end;
end;
Для подключения использую код
procedure TForm1.Button1Click(Sender: TObject);
var
Doc: DocumentEvents;
WordSink: TWordSink;
begin
Doc := CreateOleObject( 'Word.Document' ) as DocumentEvents;
WordSink := TWordSink.CreateConnected( Doc );
end;
На первой же строчке получаю ошибку
Interface not supportedПодскажите, как подключиться к событиям ворда.
P.S.
Не предлагайте использование объектов типа TWordApplication или _Application. Нужно именно через OLE.