在delphi中怎么调用以com组件方式编写的dll(200分)

  • 主题发起人 主题发起人 xao_hx
  • 开始时间 开始时间
X

xao_hx

Unregistered / Unconfirmed
GUEST, unregistred user!
项目中需要调用别人写的dll,这个dll是以 com组件的方式对外提供服务的,需要先注册的,在delphi中按传统dll调用方式调用不了,该怎么办?
 
project->import type lib
 
完全可以按照 dll 的方式和 com 组件进行通信的。
这是我以前写的一段“不注册 com 直接加载 com 对象”的代码(主要就是获得 IClassFactory 然后通过它去创建 com 对象,避免了需要目标系统中“注册”使用):
procedure TJetCarNetscape.InitFlashGetLib;
const
defJetCarNetscapeDisp: TGUID = '{FB5DA723-162B-11D3-8B9B-AA70B4B0B524}';
var
DllGetClassObject: function (const CLSID, IID: TGUID;
var Obj): HResult;
stdcall;
cFactory: IClassFactory;
strFile: string;
cIntf: IDispatch;
begin
strFile := ExtractFilePath(GetModuleName(HInstance)) + 'jccatch.dll';
FHandle := LoadLibrary(PChar(strFile));
@DllGetClassObject := GetProcAddress(FHandle, 'DllGetClassObject');
DllGetClassObject(CLASS_JetCarNetscape, IClassFactory, cFactory);
{
if cFactory <> nil then
cFactory.CreateInstance(nil, fglib.IJetCarNetscape, FJetCar);
}
if cFactory <> nil then
cFactory.CreateInstance(nil, defJetCarNetscapeDisp, cIntf)
else
cIntf := nil;
FJetCar := cIntf;
end;
至于接口的使用方法,只要 import typelib 产生一个 _tlb.pas 按照里面的 interface 使用即可。
 
楼上使用COM的方法真的是很另类,要狠狠的批判!
批判理由:1.你这样用比真正的COM组件调用方法还要复杂的多!
2.你这样做发挥不了COM组件的优势,比如多实例,多线程,网络的透明性等等。更重要的是这样用还不能保证不出错,也就是说这样很容易出错。
 
//先要通过uses 引用Ixxxx所在单元文件。
var
a1:Ixxxx;
begin
a1:=Coxxxx.Create;
//本地调用
//a1:=Coxxxx.CreateRemote('10.10.10.xx');
//远程调用
a1.method1;
//调用method1方法
a1.method2;
..
..
a1:=nil;
//释放
end;

还需要看COM方面的书,COM有一些规则和我们平常用的面向对象的那一套不太一样.想搞COM靠突击学习几天是不行的.
 
to gencheng:
呵呵,这个确实很另类,其实这是不得已而为之啊,主要原因有两个:
1、在我的项目中不希望别人注册低版本的 ocx 对我产生干扰,类似于 ms 著名的 dll hell
2、由于一些原因,我没有管理员权限注册 com(比如,我不能“install”,而且在 vista 下),我只能自己加载 com 然后使用。
3、也不麻烦啊,你以前调用 Coxxx 创建接口对象,我现在使用自己的方法创建接口对象,剩下的使用方式没有任何区别啊。
4、除了无法实现 dcom,其他的都 ok 啊,因为这就是 ms com 规范加载的方式,怎么容易出错呢?
;>
 
接口会自动释放的
还有,看楼上的是属于拿了COM当DLL用的,应该不会有啥错
不过,确实很另类,这样还不如写个DLL算了,这样反而麻烦了:)
 
后退
顶部