Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Народ, а как правильно создать   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.043 c
4-1119951512
Gear
2005-06-28 13:38
2005.08.21
Окна


1-1122641358
slotti
2005-07-29 16:49
2005.08.21
Как узнать количество созданных обьектов ?


14-1122665035
fen
2005-07-29 23:23
2005.08.21
ехе


6-1115884049
DmitryMN
2005-05-12 11:47
2005.08.21
Проблема с пересылкой записи чеп рез сокет


1-1122966066
rolex
2005-08-02 11:01
2005.08.21
На одном компе нужно "." а на другом "," !