delphi调用C++动态链接库的问题(100)

  • 主题发起人 主题发起人 chrysalis
  • 开始时间 开始时间
C

chrysalis

Unregistered / Unconfirmed
GUEST, unregistred user!
C++的原型如下:功能描述:创建基于串口,USB口或者以太网接口或其他扩展接口之一的连接状态。 函数原型: bool SAAT_Open(void* pHandle) 传入参数: pHandle 为已经初始化的端口句柄 返回值:true:操作成功;false:操作失败。Delphi里调用 procedure TfrmMain.Button3Click(Sender: TObject);type TIntFunc=function (mHandle:pHandle):Bool;stdcall;var Th:Thandle; Tf:TIntFunc; Tp:TFarProc;begin Th:=LoadLibrary('RFIDAPI.dll'); {装载DLL}if Th>0 then try Tp:=GetProcAddress(Th,PChar('SAAT_Open')); if Tp<>nil then begin Tf:=TIntFunc(Tp); //%%%%%%%%%%%%%调试时程序没有执行这一步 Tf(@TH); {调用函数} end else ShowMessage('SAAT_Open函数没有找到'); finally FreeLibrary(Th); {释放DLL} end else ShowMessage('RFIDAPI.dll没有找到');end;这是典型的动态调用了执行的时候出现问题 'access violation at address 00000000.read of address 00000000'
 
pHandle 为已经初始化的端口句柄 要求初始化 pHandle, 你的代码里把动态链接库的句柄传进去当然不对,要的是端口句柄。
 
我可能把它写得复杂化了function SAAT_Open(mHand: THandle):bool;cdecl;external 'RFIDAPI.DLL' name 'SAAT_Open';觉这里为定义procedure TfrmMain.Button4Click(Sender: TObject); var mHandle:THandle;begin SAAT_Open(Handle);end;
 
Tf:=TIntFunc(Tp); //%%%%%%%%%%%%%调试时程序没有执行这一步本来就没有被编译进去!
 
就没有真正解决问题的么?
 
TIntFunc=function (mHandle:pHandle):Bool;stdcall; SAAT_Open(mHand: THandle):bool;cdecl;stdcall 和 cdecl; 不匹配, 改成一样再试试
 
是不是调用方式的问题啊。 一般都用stdcall
 
一看DLL的名字,就知道你是做RFID(射频识别)的。呵呵,我也是。根据函数原型,可以这样声明函数function SAAT_Open(var pHandle: THandle): Boolean; stdcall; external 'RFIDAPI.DLL';调用步骤如下,仅供参考procedure TfrmMain.Button4Click(Sender: TObject);var pHandle: THandle; IsOK: Boolean; begin //1、阅读dll的技术文档,如传入的端口句柄需要初始化,则此处写初始化pHandle的代码 //2、调用函数 IsOK := SAAT_Open(pHandle); //3、判断返回值 if IsOK then // 与读写器连接成功,写相关代码 else // 与读写器连接失败,写相关代码end;
 

Similar threads

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