结合网络上的一片文章(具体那篇文章,你可以在百度里边找“Delphi不注册调用COM”),稍加修改,得出以下心得:
其次需要知道的是,需要调用COM的CLASSID,这个很简单,在Delphi的Iamport ActiveX里边导入COM,你可以看到关于COM的接口定义。
如:
然后就是调用啦:
完成,是不是很简单,即便结果很简单,但还是花费了本人少许精力,希望对大家有用!
一下是代码下载地址:
http://115.com/file/dpq3dryo#
首先是CreateCom(来自网络)
function CreateComObjectFromDll(CLSID: TGUID; DllHandle: THandle): IUnknown;
var
Factory: IClassFactory;
DllGetClassObject: function(const CLSID, IID: TGUID; var Obj): HResult; stdcall;
hr: HRESULT;
begin
DllGetClassObject := GetProcAddress(DllHandle, 'DllGetClassObject');
if Assigned(DllGetClassObject) then
begin
hr := DllGetClassObject(CLSID, IClassFactory, Factory);
if hr = S_OK then
try
hr := Factory.CreateInstance(nil, IUnknown, Result);
if hr = S_OK then begin
end;
except
ShowMessage(IntToStr(GetLastError));
end;
end;
end;
其次需要知道的是,需要调用COM的CLASSID,这个很简单,在Delphi的Iamport ActiveX里边导入COM,你可以看到关于COM的接口定义。
如:
type
_Class1 = interface(IDispatch)
['{0BDF30B9-86FB-4E3A-BFCD-3BC4012E4B40}']
procedure SayHello; safecall;
end;
然后就是调用啦:
const
CLASS_MSComm: TGUID = '{97b5534f-3b96-40a4-88b8-19a3bf4eeb2e}'; //SyaHello所属类的接口
procedure TForm1.Button1Click(Sender: TObject);
var
Comm1:_Class1;
begin
ocxhdl := LoadLibrary('VB6Hello.dll');
try
if ocxhdl < 32 then
ShowMessage('error');
comm1 := CreateComObjectFromDll(CLASS_MSComm, ocxhdl) as _Class1;
comm1.SayHello();
//Comm1._Release; //不要自己去释放,否则会报错
finally
end;
end;
完成,是不是很简单,即便结果很简单,但还是花费了本人少许精力,希望对大家有用!
一下是代码下载地址:
http://115.com/file/dpq3dryo#