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