function CreateComObjectFromDll(CLSID: TGUID; DllHandle: THandle): IUnknown; var Factory: IClassFactory; DllGetClassObject: function(const CLSID, IID: TGUID; var Obj): HResult; stdcall; begin DllGetClassObject := GetProcAddress(DllHandle, 'DllGetClassObject'); if Assigned(DllGetClassObject) then begin DllGetClassObject(CLSID, IClassFactory, Factory); Factory.CreateInstance(nil, IUnknown, Result); end; end;
function CreateComObjectFromDll(CLSID: TGUID; DllHandle: THandle): IUnknown;
implementation
{$R *.dfm}
function CreateComObjectFromDll(CLSID: TGUID; DllHandle: THandle): IUnknown; var Factory: IClassFactory; DllGetClassObject: function(const CLSID, IID: TGUID; var Obj): HResult; stdcall; begin DllGetClassObject := GetProcAddress(DllHandle, 'DllGetClassObject'); if Assigned(DllGetClassObject) then begin DllGetClassObject(CLSID, IClassFactory, Factory); Factory.CreateInstance(nil, IUnknown, Result); end; end;
procedure TForm1.Button1Click(Sender: TObject); begin ocxhdl := LoadLibrary('mscomm32.ocx'); if ocxhdl < 32 then ShowMessage('error'); end;
procedure TForm1.Button2Click(Sender: TObject); begin comm := CreateComObjectFromDll(CLASS_MSComm, ocxhdl) as IDispatch; end;
procedure TForm1.Button3Click(Sender: TObject); begin comm.AboutBox; end;
procedure TForm1.Button4Click(Sender: TObject); begin comm := Null; end;