国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Delphi > 正文

DELPHI實現activex控件的限制

2019-11-18 18:28:07
字體:
來源:轉載
供稿:網友
  個人認為DELPHI實現activex控件的限制存在于DELPHIactivex控件的基類派生于TAutoObject如下:

TActiveXControl = class(TAutoObject,
    IConnectionPointContainer,
    IDataObject,
    IObjectSafety,
    IOleControl,
    IOleInPlaceActiveObject,
    IOleInPlaceObject,
    IOleObject,
    iperPRopertyBrowsing,
    IPersistPropertyBag,
    IPersistStorage,
    IPersistStreamInit,
    IQuickActivate,
    ISimpleFrameSite,
    ISpecifyPropertyPages,
    IViewObject,
    IViewObject2)

  ....

  ....

end;

 

DELPHI制作過activex控件的人都知道DELPHIactivex控件向導中必須指明控件包含的VCL窗體控件(從TWinControl派生的VCL控件),這樣就使得它的實現必須包含一個VCL窗體控件,而為了讓這個VCL窗體控件隨時可用DELPHI還要為該控件提供一個父窗口??聪旅娲a:

procedure TActiveXControl.Initialize;

begin

  inherited Initialize;

  FConnectionPoints := TConnectionPoints.Create(Self);

  FControlFactory := Factory as TActiveXControlFactory;

  if FControlFactory.EventTypeInfo <> nil then

    FConnectionPoints.CreateConnectionPoint(FControlFactory.EventIID,

      ckSingle, EventConnect);

  FPropertySinks := FConnectionPoints.CreateConnectionPoint(IPropertyNotifySink,

    ckMulti, nil);

  FControl := FControlFactory.WinControlClass.CreateParented(ParkingWindow);

  if csReflector in FControl.ControlStyle then

    FWinControl := TReflectorWindow.Create(ParkingWindow, FControl) else

    FWinControl := FControl;

  FControlWndProc := FControl.WindowProc;

  FControl.WindowProc := WndProc;

  InitializeControl;

end;

這就是DELPHI實現activex控件的限制,我們如何去控制這個ParkingWindow就算能夠控制整個activex控件的體積以及膨脹了很多了,在internet上的activex控件越小越好,至少現在的DELPHI要實現類似vc輕量級控件(只實現IPersistStreamInit,IOleControl,IOleObjectIOleInPlaceActiveObject,IViewObjectEx,IOleInPlaceObjectWindowless這些接口的COM對象)非常困難,更不要說要按需(根據activex控件的使用范圍是IE還是Word或者其他)實現接口了。一種解決方案就是不從TAutoObject派生而是直接從窗體控件派生如下:

 

TMyActiveXControl=class(TMyControl,

//TMyControl一般的類也可以是VCL窗體控件類.

//下面的接口并不總是需要派生和實現??砂葱枧缮蛯崿F

    IConnectionPointContainer,
    IDataObject,
    IObjectSafety,
    IOleControl,
    IOleInPlaceActiveObject,
    IOleInPlaceObject,
    IOleObject,
    IPerPropertyBrowsing,
    IPersistPropertyBag,
    IPersistStorage,
    IPersistStreamInit,
    IQuickActivate,
    ISimpleFrameSite,
    ISpecifyPropertyPages,
    IViewObject,
    IViewObject2)

  ....

  ....

end;

 

但是如果這樣,新的問題又產生了,如何注冊這個activex控件呢?因為沒有合適的類廠對象,DELPHI的類廠是如下關系:

TComObjectFactory-->TTypedComObjectFactory-->TAutoObjectFactory

-->TActiveXControlFactory-->TActiveFormFactory

TComObjectFactory是這樣實現的,

TComObject = class(TObject, IUnknown, ISupportErrorInfo)

。。。。

End;

TComClass = class of TComObject;

TComObjectFactory = class(TObject, IUnknown, IClassFactory, IClassFactory2)

…..

constructor Create(ComServer: TComServerObject; ComClass: TComClass;

      const ClassID: TGUID; const ClassName, Description: string;

      Instancing: TClassInstancing; ThreadingModel: TThreadingModel = tmSingle);

End;

類廠的構造函數要求ComClass這個參數,而TComObject是從TObject派生的,因此如我們根本找不到合適的類廠基類來派生,除非有下面的delphi實現:

TMyComObject = class(TMyControl, IUnknown, ISupportErrorInfo)

。。。。

End;

TMyComClass = class of TMyComObject;

TMyComObjectFactory = class(TObject, IUnknown, IClassFactory, IClassFactory2)

…..

constructor Create(ComServer: TComServerObject; MyComClass: TMyComClass;

      const ClassID: TGUID; const ClassName, Description: string;

      Instancing: TClassInstancing; ThreadingModel: TThreadingModel = tmSingle);

End;

可惜就算有這樣的一個類我們也無法使用,這個限制來自于DELPHICOM類廠的實現如下:

TComServer = class(TComServerObject)

Private

。。。。

  procedure FactoryFree(Factory: TComObjectFactory);

  procedure FactoryRegisterClassObject(Factory: TComObjectFactory);

  procedure FactoryUpdateRegistry(Factory: TComObjectFactory);

  procedure LastReleased;

end;

問題就出在這幾個函數,這幾個函數要求參數是TComObjectFactory類型,也就是說要使用delphi提供的COM服務器的實現,那么COM對象的類廠就必須從TComObjectFactory派生,我沒想通這兒為什么不使用接口,比如是如下實現:

TComServer = class(TComServerObject)

Private

。。。。

  procedure FactoryFree(Factory: IClassFactory);

  procedure FactoryRegisterClassObject(Factory: IClassFactory);

  procedure FactoryUpdateRegistry(Factory: IClassFactory);

  procedure LastReleased;

end;

追根到底問題出在delphi提供的COM服務器的實現以及類廠的實現上了,這下就沒法了,至少我現在還沒有找到什么好辦法,現在想到的就只有自己實現COM服務器dll以及自己的activex控件類工廠了(實際上也做了一個,感覺還是很簡單,有些delph實現COM服務器的的方法可以直接使用)。

上一篇:Delphi中的線程類--之(2)

下一篇:Delphi中的線程類--之(1)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
學習交流
熱門圖片

新聞熱點

疑難解答

圖片精選

網友關注

主站蜘蛛池模板: 新巴尔虎右旗| 顺昌县| 合阳县| 德钦县| 海阳市| 阿合奇县| 教育| 嘉峪关市| 博白县| 呼伦贝尔市| 荆门市| 瑞金市| 额敏县| 吉安县| 罗江县| 绥滨县| 新民市| 日喀则市| 乌审旗| 绥芬河市| 彩票| 于都县| 茶陵县| 舒兰市| 碌曲县| 高密市| 淮滨县| 白玉县| 马鞍山市| 清丰县| 桐梓县| 闸北区| 洛浦县| 汾西县| 富宁县| 思茅市| 阿拉善盟| 枝江市| 银川市| 珠海市| 遂溪县|