以下类允许你在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
|
请发表评论