Delphi(Lazarus)怎样不注册调用COM

结合网络上的一片文章(具体那篇文章,你可以在百度里边找“Delphi不注册调用COM”),稍加修改,得出以下心得:

首先是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#

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值