请教下面的代码中有什么问题?(Delphi中调用VC开发的DLL函数) ( 积分: 100 )

  • 主题发起人 主题发起人 jackiedragon
  • 开始时间 开始时间
J

jackiedragon

Unregistered / Unconfirmed
GUEST, unregistred user!
有VC编成的DLL中有一函数,原型如下:
typedef long HEKEY;
DWORD XC_ConnectEkey(
IN DWORD dwPort,
OUT HEKEY *phEkey
);
其中,IN表示传入的参数,OUT表示将输出的参数(将改变它的值),dwPort表示端口号,phEkey表示指HEKEY句柄的指针。
现在我在Delphi要调用该函数,代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Function XC_ConnectEkey( port: Integer;var hEkey:THandle): Integer ;
stdcall;

var
Form1: TForm1;
implementation
Function XC_ConnectEkey;external'xcsp_eclib.dll';
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
port:integer;
hEkey:THandle;
RetCode:integer;
begin
for port:=0 to 7do
//port取值为0..7
begin
RetCode:=XC_ConnectEkey(port,hEkey);
if RetCode=0 then
begin
Application.MessageBox('Ekey已连接上','信息框',MB_OK+MB_ICONINFORMATION);
break;
end
end;
end;
end.

上面的程序能够正确运行,但在程序运行结束时出现异常而出错。
我感到主要是第二个参数的类型出错了,上面代码是用的THandle类型,我还试过lonint类型,但都程序运行结束时出现异常而出错,应该设置第二个参数的类型?请高手指点?非常感谢
(Function XC_ConnectEkey( port: Integer;var hEkey:^THandle): Integer ;
stdcall;编译通不过
Function XC_ConnectEkey( port: Integer;var hEkey:^Longint): Integer ;
stdcall;编译通不过)
 
有VC编成的DLL中有一函数,原型如下:
typedef long HEKEY;
DWORD XC_ConnectEkey(
IN DWORD dwPort,
OUT HEKEY *phEkey
);
其中,IN表示传入的参数,OUT表示将输出的参数(将改变它的值),dwPort表示端口号,phEkey表示指HEKEY句柄的指针。
现在我在Delphi要调用该函数,代码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

Function XC_ConnectEkey( port: Integer;var hEkey:THandle): Integer ;
stdcall;

var
Form1: TForm1;
implementation
Function XC_ConnectEkey;external'xcsp_eclib.dll';
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
port:integer;
hEkey:THandle;
RetCode:integer;
begin
for port:=0 to 7do
//port取值为0..7
begin
RetCode:=XC_ConnectEkey(port,hEkey);
if RetCode=0 then
begin
Application.MessageBox('Ekey已连接上','信息框',MB_OK+MB_ICONINFORMATION);
break;
end
end;
end;
end.

上面的程序能够正确运行,但在程序运行结束时出现异常而出错。
我感到主要是第二个参数的类型出错了,上面代码是用的THandle类型,我还试过lonint类型,但都程序运行结束时出现异常而出错,应该设置第二个参数的类型?请高手指点?非常感谢
(Function XC_ConnectEkey( port: Integer;var hEkey:^THandle): Integer ;
stdcall;编译通不过
Function XC_ConnectEkey( port: Integer;var hEkey:^Longint): Integer ;
stdcall;编译通不过)
 
有内存泄漏,不知道出在哪?
 
VC默认格式__cdecl,在Delphi中要注明调用格式为cdecl
Function XC_ConnectEkey( port: Integer;var hEkey:THandle): Integer ;
cdecl;
如果还不对,再确认VC那边函数声明是怎样的,一句话,两边要一样
 
另外DWord和Integer不完全等价,最好声明成DWord
 
我认为第二个参数的类型不正确,请高手多注意这个
 
已经搞定了,确定如njxdh兄所言,十分感谢!
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部