请教各位怎么调用该COM接口的DLL?急!

时间:2022-02-22 04:48:45
请教各位怎么调用该COM接口的DLL?急!

DLL文件:HotelReader.dll
下载地址:http://www.onlense.com/hotelreader.dll
供应商给我们提供了一个VB写的软件,也给了份其中一DLL的接口说明。该DLL文件是COM接口的。

我调用的方法是  Project--import type library---add  将其安装到ACTIVE面板上,再调用的。

可不知道为什么老出错,DLL里的一个方法都调用不成功,运行时老提示"Access violation at address 0040580D in module "RF.exe".Read of address 4D004104".
请教各位,为什么会有这样的提示?

动态库里面有一个NewAuthorizationCode方法,可以随机创建一个Widestring类型的字符串,
哪位大哥能帮我写一段代码,用该方法创建一个字符串并且Showmessage出来?不够分我再加。

DLL文件下载地址:http://www.onlense.com/hotelreader.dll



以下是DLL文件接口说明的前部分
------------------------------
COM接口说明

1. 概述
该接口采用COM接口,在使用之前须注册HotelReader.dll COM控件

2. 属性
.AuthorizationCode
访问:读/写
类型:OLE字符串
系统授权码,用户从存储于数据库、注册表或文件中获得此值,
此值的产生请调用.属性NewAuthorizationCode

......

27 个解决方案

#1


给你up一下!!

#2


COM高手来帮帮忙啊。

#3


MARK

#4


楼上的什么意思?能说清楚点吗?

#5


我们自己用VC写一个Com控件,注册一下,就可以直接在Delphi下使用的;
不知道那个怎么就不行。
如果你自己再包一层呢?先用VC调用通过;然后用VC开发一个中间调用层。

#6


有用VB写的软件的, 我只想用DELPHI再写一个。
你能告诉我你是怎么调用的吗?
或者你下载我那个DLL下来看能否调用成功?

谢谢了

#7


大家来帮帮忙啊?郁闷哦 55555555

#8


uses
COmobj;


var
var com :OleVariant;
begin
  com := CreateOLEObject('你的com对象得实例名');
  com.NewAuthorizationCode //这里和vb一样得用

end;

#9


project->Import type library ,找到你得dll ,然后create Unit ,获得HOTELREADERLib_TLB,在你得 form中uses 它,写入如下代码即可:

uses  HOTELREADERLib_TLB;

var
  s                 : WideString;
  aa                : TCard;
begin
  aa := TCard.Create(SELF);
  s := aa.NewAuthorizationCode;
  showmessage(s);
end;

#10


//方法2,使用ole 方式创建,这样就不需要Import type library 即可动态创建;

uses comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
  s                 : WideString;
  com               : OleVariant;
begin
  com := CreateOLEObject('HotelReader.Card');
  showmessage(widestring(com.NewAuthorizationCode));
end;

//以上2种方法均需要先注册dll,方法为:regsvr32 hotelreader.dll 

支持得接口为:
Card,Client,Clients,LockEvent,PerEvent,Server,Servers

OLE 方式访问为:
HotelReader.Card (前缀为HotelReader.接口名)

查看方法和属性得快速方法,一是采用delphi 得Import type library 后生成得lib代码,二是使用vb,在引入后按F2,选择库HOTELREADERLib即可浏览;

good luck.

#11


谢谢 S.F. 的回复

--------------------
  com := CreateOLEObject('你的com对象得实例名');
  com.NewAuthorizationCode //这里和vb一样得用
------------------------
这个方法我试过,我不知道怎么可以知道它COM对象的实例名,运行时老提示没有注册类别之类的。

------------------
  aa := TCard.Create(SELF);
  s := aa.NewAuthorizationCode;
  showmessage(s);
------------------
这个方法我也试过的,如果去掉aa := TCard.Create(SELF);这句它就提示
address 0040580D in module "RF.exe".Read of address 4D004104".

你能载下我的DLL帮我试下吗?非常感谢。

在执行第一句时会提示“创建对象失败....”,然后就不执行下面的了。

如果不要

#12


首先,你如果采用我提供得方式1得话;你就必须TCard.create ;

采用方法2得话,必须拥有正确得类名,我已经提供了;并且都调试过;

另外,还得注意,你得dll并不是动态链接库,而是一个com,也不是一定需要vc之类得再封装,只是你要搞明白你得先用regsvr32 注册它到系统内,还有,你得程序要正常运行还得接上硬件,至于是什么硬件,我就不知道了,无非就是堵卡器之类得设备;

#13


你如果说你对com调用一点都不懂得话,我也没有办法了,我是中秋节才休息一天上上csdn,可不想在宝贵得假期帮你调试程序:)

#14


我的DLL是要接一个IC发卡机的,但我调用它最基本的NewAuthorizationCode方法创建一字符串再SHOWMESSAGE出来都不行,执行时就出错:address 0040580D in module "RF.exe".Read of address 4D004104

你能用它来NewAuthorizationCode方法创建一字符串再SHOWMESSAGE出来吗?是用你上面那段代码吗?我的怎么不行,郁闷哦。

不管怎么样,非常感谢你!^_^

#15


不客气:)
最直接得办法,你可以把这个问题反映给提供接口得厂商,当然,前提保证你都没有弄错,硬件设备上也没有问题,而错误在于他们。

#16


或者你换台计算机,首先将dll 使用regsvr32 工具注册,再测试,不接硬件设备执行我写得代码,应该会提示设备连接失败之类得错误信息;

建议使用vmware workstation虚拟pc做测试平台

#17


厂商那边只提供了个VB写的软件,VB代码都不给一点,更别说DELPHI的了。

DLL用REGSVR32注册过的,也换过机器(没在虚拟机上测试),但执行时就会出错。问过好多人了,都不知道什么原因。555

#18


RF.exe 是你得程序?执行得时候按f8跟踪看看,看看创建com对象是否正常,调用方法得时候是直接出现地址错误?dll文件版本正确吗?用vb调用试试看?

#19


我不会VB

procedure TForm1.Button1Click(Sender: TObject);
var
a:TCard;
s:Widestring;
begin
  a:=TCard.Create(self);
  s:=a.NewAuthorizationCode;
  showmessage(s);
end;

这段代码执行时错误出现在HOTELREADERLib_TLB单元的函数Get_NewAuthorizationCode上
function TCard.Get_NewAuthorizationCode: WideString;
begin
    Result := DefaultInterface.NewAuthorizationCode;
end;
错误提示是:暂不支持的门锁类型或创建对象失败或内存不足。


而代码改成这样则没错误提示
procedure TForm1.Button1Click(Sender: TObject);
var
a:TCard;
s:Widestring;
begin
  a:=TCard.Create(self);
end;

为什么一调用它的方法就会出错了呢?

#20


用过一个dll的com,现将我的用法写出来,希望能对你有帮助:
1.注册com的dll文件:在运行里使用regsvr32命令:regsvr32 xxxx.dll
2.在delphi中导入dll文件,生成TLB文件,并加入uses中
3.定义变量,注意是一个接口变量,类似Ixxx的一个类,查查tlb的文件找找看
4.创建接口对象:变量名:=coxxx.create;
现在就可以使用这个接口了,如果需有客户端支持,请一并配制好

#21


procedure TForm1.Button1Click(Sender: TObject);
var
a:ICard;
s:Widestring;
begin
  a:=coCard.Create;
 s:=a.NewAuthorizationCode;
  showmessage(s);
end;

也是出现上面那种错误哦,5555

#22


错误提示是:暂不支持的门锁类型或创建对象失败或内存不足。

这句是com对象提示得,表示你调用没有问题;问题应该是你没用对;也许使用newauthorizationcode方法之前你还得指定访问得硬件得相关属性

#23


嗯,可说明上是说直接调用的。

--------------------------------
COM接口说明

1. 概述
该接口采用COM接口,在使用之前须注册HotelReader.dll COM控件

2. 属性
.AuthorizationCode
访问:读/写
类型:OLE字符串
系统授权码,用户从存储于数据库、注册表或文件中获得此值,
此值的产生请调用.属性NewAuthorizationCode
.......
-----------------------------------------

#24


建议你问问厂商,这个办法会很有效

#25


嗯,好的。明天上班再问厂商那边。

谢谢 S.F.(chinasf.cnblogs.com) .能告诉我你的QQ号码吗?我QQ的是231221

再过半小时再结贴吧

#26


我得qq:410000
认识你很高兴

#27


呵呵,标记下,到时候学习

#1


给你up一下!!

#2


COM高手来帮帮忙啊。

#3


MARK

#4


楼上的什么意思?能说清楚点吗?

#5


我们自己用VC写一个Com控件,注册一下,就可以直接在Delphi下使用的;
不知道那个怎么就不行。
如果你自己再包一层呢?先用VC调用通过;然后用VC开发一个中间调用层。

#6


有用VB写的软件的, 我只想用DELPHI再写一个。
你能告诉我你是怎么调用的吗?
或者你下载我那个DLL下来看能否调用成功?

谢谢了

#7


大家来帮帮忙啊?郁闷哦 55555555

#8


uses
COmobj;


var
var com :OleVariant;
begin
  com := CreateOLEObject('你的com对象得实例名');
  com.NewAuthorizationCode //这里和vb一样得用

end;

#9


project->Import type library ,找到你得dll ,然后create Unit ,获得HOTELREADERLib_TLB,在你得 form中uses 它,写入如下代码即可:

uses  HOTELREADERLib_TLB;

var
  s                 : WideString;
  aa                : TCard;
begin
  aa := TCard.Create(SELF);
  s := aa.NewAuthorizationCode;
  showmessage(s);
end;

#10


//方法2,使用ole 方式创建,这样就不需要Import type library 即可动态创建;

uses comobj;

procedure TForm1.Button1Click(Sender: TObject);
var
  s                 : WideString;
  com               : OleVariant;
begin
  com := CreateOLEObject('HotelReader.Card');
  showmessage(widestring(com.NewAuthorizationCode));
end;

//以上2种方法均需要先注册dll,方法为:regsvr32 hotelreader.dll 

支持得接口为:
Card,Client,Clients,LockEvent,PerEvent,Server,Servers

OLE 方式访问为:
HotelReader.Card (前缀为HotelReader.接口名)

查看方法和属性得快速方法,一是采用delphi 得Import type library 后生成得lib代码,二是使用vb,在引入后按F2,选择库HOTELREADERLib即可浏览;

good luck.

#11


谢谢 S.F. 的回复

--------------------
  com := CreateOLEObject('你的com对象得实例名');
  com.NewAuthorizationCode //这里和vb一样得用
------------------------
这个方法我试过,我不知道怎么可以知道它COM对象的实例名,运行时老提示没有注册类别之类的。

------------------
  aa := TCard.Create(SELF);
  s := aa.NewAuthorizationCode;
  showmessage(s);
------------------
这个方法我也试过的,如果去掉aa := TCard.Create(SELF);这句它就提示
address 0040580D in module "RF.exe".Read of address 4D004104".

你能载下我的DLL帮我试下吗?非常感谢。

在执行第一句时会提示“创建对象失败....”,然后就不执行下面的了。

如果不要

#12


首先,你如果采用我提供得方式1得话;你就必须TCard.create ;

采用方法2得话,必须拥有正确得类名,我已经提供了;并且都调试过;

另外,还得注意,你得dll并不是动态链接库,而是一个com,也不是一定需要vc之类得再封装,只是你要搞明白你得先用regsvr32 注册它到系统内,还有,你得程序要正常运行还得接上硬件,至于是什么硬件,我就不知道了,无非就是堵卡器之类得设备;

#13


你如果说你对com调用一点都不懂得话,我也没有办法了,我是中秋节才休息一天上上csdn,可不想在宝贵得假期帮你调试程序:)

#14


我的DLL是要接一个IC发卡机的,但我调用它最基本的NewAuthorizationCode方法创建一字符串再SHOWMESSAGE出来都不行,执行时就出错:address 0040580D in module "RF.exe".Read of address 4D004104

你能用它来NewAuthorizationCode方法创建一字符串再SHOWMESSAGE出来吗?是用你上面那段代码吗?我的怎么不行,郁闷哦。

不管怎么样,非常感谢你!^_^

#15


不客气:)
最直接得办法,你可以把这个问题反映给提供接口得厂商,当然,前提保证你都没有弄错,硬件设备上也没有问题,而错误在于他们。

#16


或者你换台计算机,首先将dll 使用regsvr32 工具注册,再测试,不接硬件设备执行我写得代码,应该会提示设备连接失败之类得错误信息;

建议使用vmware workstation虚拟pc做测试平台

#17


厂商那边只提供了个VB写的软件,VB代码都不给一点,更别说DELPHI的了。

DLL用REGSVR32注册过的,也换过机器(没在虚拟机上测试),但执行时就会出错。问过好多人了,都不知道什么原因。555

#18


RF.exe 是你得程序?执行得时候按f8跟踪看看,看看创建com对象是否正常,调用方法得时候是直接出现地址错误?dll文件版本正确吗?用vb调用试试看?

#19


我不会VB

procedure TForm1.Button1Click(Sender: TObject);
var
a:TCard;
s:Widestring;
begin
  a:=TCard.Create(self);
  s:=a.NewAuthorizationCode;
  showmessage(s);
end;

这段代码执行时错误出现在HOTELREADERLib_TLB单元的函数Get_NewAuthorizationCode上
function TCard.Get_NewAuthorizationCode: WideString;
begin
    Result := DefaultInterface.NewAuthorizationCode;
end;
错误提示是:暂不支持的门锁类型或创建对象失败或内存不足。


而代码改成这样则没错误提示
procedure TForm1.Button1Click(Sender: TObject);
var
a:TCard;
s:Widestring;
begin
  a:=TCard.Create(self);
end;

为什么一调用它的方法就会出错了呢?

#20


用过一个dll的com,现将我的用法写出来,希望能对你有帮助:
1.注册com的dll文件:在运行里使用regsvr32命令:regsvr32 xxxx.dll
2.在delphi中导入dll文件,生成TLB文件,并加入uses中
3.定义变量,注意是一个接口变量,类似Ixxx的一个类,查查tlb的文件找找看
4.创建接口对象:变量名:=coxxx.create;
现在就可以使用这个接口了,如果需有客户端支持,请一并配制好

#21


procedure TForm1.Button1Click(Sender: TObject);
var
a:ICard;
s:Widestring;
begin
  a:=coCard.Create;
 s:=a.NewAuthorizationCode;
  showmessage(s);
end;

也是出现上面那种错误哦,5555

#22


错误提示是:暂不支持的门锁类型或创建对象失败或内存不足。

这句是com对象提示得,表示你调用没有问题;问题应该是你没用对;也许使用newauthorizationcode方法之前你还得指定访问得硬件得相关属性

#23


嗯,可说明上是说直接调用的。

--------------------------------
COM接口说明

1. 概述
该接口采用COM接口,在使用之前须注册HotelReader.dll COM控件

2. 属性
.AuthorizationCode
访问:读/写
类型:OLE字符串
系统授权码,用户从存储于数据库、注册表或文件中获得此值,
此值的产生请调用.属性NewAuthorizationCode
.......
-----------------------------------------

#24


建议你问问厂商,这个办法会很有效

#25


嗯,好的。明天上班再问厂商那边。

谢谢 S.F.(chinasf.cnblogs.com) .能告诉我你的QQ号码吗?我QQ的是231221

再过半小时再结贴吧

#26


我得qq:410000
认识你很高兴

#27


呵呵,标记下,到时候学习