HeQing博客之家

.Net、Delphi、VC技术交流

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

以下类允许你在Delphi中动态的创建一个ActiveX组件,并在窗口上显示出来。

unit DynamicOleControl;

interface

uses Windows, Classes, ActiveX, OleCtrls, ComObj;

type
  TDynamicOleControl = class(TOleControl)
  private
    FClassID: TGUID;
    FIntf: IUnknown;

    function  GetControlInterface: IUnknown;
  protected
    procedure CreateControl;
    procedure InitControlData; override;
  public
    constructor CreateFromClassID(AOwner: TComponent; AClassID: TGUID); overload;
    constructor CreateFromClassID(AOwner: TComponent; AClassID: string); overload;
    constructor CreateFromProgID(AOwner: TComponent; AProgID: string);

    property  ControlInterface: IUnknown read GetControlInterface;
    property  DefaultInterface: IUnknown read GetControlInterface;

  published
    property Anchors;
  end;

implementation

constructor TDynamicOleControl.CreateFromClassID(AOwner: TComponent;
  AClassID: TGUID);
begin
  FClassID := AClassID;

  inherited Create(AOwner);
end;

constructor TDynamicOleControl.CreateFromClassID(AOwner: TComponent; AClassID: string);
begin
  FClassID := StringToGUID(AClassID);
  inherited Create(AOwner);
end;

constructor TDynamicOleControl.CreateFromProgID(AOwner: TComponent;
  AProgID: string);
begin
  FClassID := ProgIDToClassID(AProgID);
  inherited Create(AOwner);
end;

procedure TDynamicOleControl.InitControlData;
const
  CControlData: TControlData2 = (
    ClassID: '';
    EventIID: '';
    EventCount: 0;
    LicenseKey: nil;
    Flags: $00000000; //$0000001D
    Version: 401
    );
begin
  CopyMemory(@CControlData.ClassID, @FClassID, SizeOf(TGUID));
  ControlData := @CControlData;
end;

procedure TDynamicOleControl.CreateControl;

  procedure DoCreate;
  begin
    FIntf := IUnknown(OleObject) as IUnknown;
  end;

begin
  if FIntf = nil then DoCreate;
end;

function TDynamicOleControl.GetControlInterface: IUnknown;
begin
  CreateControl;
  Result := FIntf;
end;

end.

源码和例子下载:DynamicOleSample.rar

posted on 2007-04-12 01:52  HeQing博客之家  阅读(819)  评论(1编辑  收藏  举报