在Delphi中动态创建ActiveX组件

以下类允许你在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