Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизНарод, а как правильно создать Найти похожие ветки
← →
Nick Denry © (2005-07-29 17:48) [0]экземпляр ActiveX интерфейса? (т.е. в системе установлен контрол мне известен его CLASS_ и IID_).
Я создаю через CreateComObject, но не уверен что это правильно.
Какие еще функции существуют?
← →
oldman © (2005-07-29 18:03) [1]Создал?
Работает?
Значит - правильно.
имхо...
← →
Nick Denry © (2005-07-29 18:47) [2]Хорошо, тогда вопрос стоит след. образом:
Допустим имея CLASS_ для экземпляра браузера я создаю его так:WebBr := CreateComObject(CLASS_InternetExplorer) as IWebBrowser2;
А как тогда создать объект интерфейса DIID_DWebBrowserEvents, который определен какIWebBrowserDisp
и как обрабатывать события?
к сожалению надо "чиста на АПИ" (с)....
И я не уверен, что первый объек все-же создается правильно...
а примеры в MSDN идут только для MFC и VB, причем и там и там компонентная модель :(
а модульSHDocVw
, к сожалению использует совершенно непонятные вставки типаprocedure TWebBrowser_V1.InitControlData;
const
CEventDispIDs: array [0..16] of DWORD = (
$00000064, $00000065, $00000066, $0000006C, $00000068, $00000069,
$0000006A, $0000006B, $00000071, $000000C8, $000000C9, $000000CC,
$00000067, $0000006D, $0000006E, $0000006F, $00000070);
CControlData: TControlData2 = (
ClassID: "{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}";
EventIID: "{EAB22AC2-30C1-11CF-A7EB-0000C05BAE0B}";
EventCount: 17;
EventDispIDs: @CEventDispIDs;
LicenseKey: nil (*HR:$80040154*);
Flags: $00000000;
Version: 401);
begin
ControlData := @CControlData;
TControlData2(CControlData).FirstEventOfs := Cardinal(@@FOnBeforeNavigate) - Cardinal(Self);
end;
procedure TWebBrowser_V1.CreateControl;
procedure DoCreate;
begin
FIntf := IUnknown(OleObject) as IWebBrowser;
end;
begin
if FIntf = nil then DoCreate;
end;
а сам DoCreate использует почему-то TOleControl :(procedure TOleControl.CreateControl;
var
Stream: IStream;
CS: IOleClientSite;
X: Integer;
begin
if FOleControl = nil then
try
try // work around ATL bug
X := FOleObject.GetClientSite(CS);
except
X := -1;
end;
if (X <> 0) or (CS = nil) then
OleCheck(FOleObject.SetClientSite(Self));
if FObjectData = 0 then OleCheck(FPersistStream.InitNew) else
begin
OleCheck(CreateStreamOnHGlobal(FObjectData, False, Stream));
OleCheck(FPersistStream.Load(Stream));
DestroyStorage;
end;
OleCheck(FOleObject.QueryInterface(IOleControl, FOleControl));
OleCheck(FOleObject.QueryInterface(IDispatch, FControlDispatch));
FOleObject.QueryInterface(IPerPropertyBrowsing, FPropBrowsing);
InterfaceConnect(FOleObject, IPropertyNotifySink,
Self, FPropConnection);
InterfaceConnect(FOleObject, FControlData^.EventIID,
FEventDispatch, FEventsConnection);
if FControlData^.Flags and cfBackColor <> 0 then
OnChanged(DISPID_BACKCOLOR);
if FControlData^.Flags and cfEnabled <> 0 then
OnChanged(DISPID_ENABLED);
if FControlData^.Flags and cfFont <> 0 then
OnChanged(DISPID_FONT);
if FControlData^.Flags and cfForeColor <> 0 then
OnChanged(DISPID_FORECOLOR);
FOleControl.OnAmbientPropertyChange(DISPID_UNKNOWN);
RequestNewObjectLayout;
except
DestroyControl;
raise;
end;
end;
← →
Nick Denry © (2005-07-30 01:24) [3]UP
← →
jack128 © (2005-07-30 01:31) [4]Nick Denry © (29.07.05 18:47) [2]
и как обрабатывать события?
IConnectionPoint, IConnectionPointContainer + F1
статья "Events in COM and Connectable Objects" в msdn и далее по тексту.
Изучать исходники, сгенерированные визардом в дельфи..
Купить какую нить книжку по com..
Страницы: 1 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.647 c