动态库中回调函数如何使用~急急急~在线等

skolar 2012-06-05 03:21:43
这是原型
typedef void(CALLBACK* vOnDeviceLogin)(int Dev_id,TSerialType Serial,char* ip,int port,int & heartbeat);

我的头文件中定义如下

void __stdcall(CALLBACK*)(int ,TSerialType ,char* ,int ,int );

加载动态库的代码如下:

vOnDeviceLogin = (void __stdcall(CALLBACK*)(int ,TSerialType ,char* ,int ,int ))::GetProcAddress(Hdl,"vOnDeviceLogin");

这样一直加载不进来,请教大大,动态库中的回调函数。怎么调用,急急急,在线等

...全文
341 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigfog 2012-06-11
  • 打赏
  • 举报
回复
加修饰 extern "C" __stdcall
导出函数就不会有“_”
skolar 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
加修饰 extern "C" __stdcall
导出函数就不会有“_”
[/Quote]

多谢大仙,问题解决了散分
skolar 2012-06-11
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
动态库是用什么开发工具写的? 如果是用C++Builder写的,函数名前缺省会加个_, 代码中要导出的函数名为vOnDeviceLogin,那dll中函数名会变成 _vOnDeviceLogin
建议用动态库查看工具Dependency Walker看了下dll的导出函数.
[/Quote]
问题解决了,void __fastcall OnDeviceLogin 这里应该用 callback ,谢谢帮忙
liskman 2012-06-10
  • 打赏
  • 举报
回复
动态库是用什么开发工具写的? 如果是用C++Builder写的,函数名前缺省会加个_, 代码中要导出的函数名为vOnDeviceLogin,那dll中函数名会变成 _vOnDeviceLogin
建议用动态库查看工具Dependency Walker看了下dll的导出函数.
skolar 2012-06-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

我是问你,DLL文件导出表中导出的函数名到底是什么?不是问你函数声明的原型。
[/Quote]
妖哥 调用的DLL当中的原型如下
void __stdcall (*SetUpLoadProc)(FunOnDeviceLogin,FunOnRefreshDeviceStateBySerial,FunOnRecieveBatchRecordBySerial);

如下定义
typedef void(CALLBACK* FunOnDeviceLogin)(int Dev_id,TSerialType Serial,char* ip,int port,int & heartbeat);

typedef void(CALLBACK* FunOnRefreshDeviceStateBySerial)(int Dev_id,TSerialType Serial,int State,int RecordCount);

typedef void(CALLBACK* FunOnRefreshDeviceStateBySerial)(int Dev_id,TSerialType Serial,int State,int RecordCount);

然后我再申请一个自定义类型的原型
FunOnDeviceLogin OnDeviceLogin;
FunOnRefreshDeviceStateBySerial OnRefreshDeviceStateBySerial;
FunOnRefreshDeviceStateBySerial OnRefreshDeviceStateBySerial;

然后再在cpp中写 OnDeviceLogin OnRefreshDeviceStateBySerial OnRefreshDeviceStateBySerial 的函数体。

void __fastcall OnDeviceLogin(int Dev_id,TSerialType Serial,char* ip,int port,int & heartbeat)
{
...
}
可是一直无法进入到回调函数,还请妖哥指点,谢谢了
ccrun.com 2012-06-07
  • 打赏
  • 举报
回复
我是问你,DLL文件导出表中导出的函数名到底是什么?不是问你函数声明的原型。
skolar 2012-06-07
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
帮解决问题,可不是代工!
写代码,主要还是靠自己!
[/Quote]
我可没说代工,主要是对delphi不了解
mabaoyes 2012-06-07
  • 打赏
  • 举报
回复
帮解决问题,可不是代工!
写代码,主要还是靠自己!
skolar 2012-06-06
  • 打赏
  • 举报
回复
函数原型:
typedef void(CALLBACK* vOnRefreshDeviceStateBySerial)(int Dev_id,TSerialType Serial,int State,int RecordCount);
功能:
接收数据的回调函数。对设备设置主动上传参数后,服务器启动监听端口,设备主动上传数据记录让服务器接收。
参数说明:
Dev_id: 机号
Serial: 序列号
index: 记录序号
RecordCount: 本次上次的记录数
Records: 记录数组, 最大16条记录。真实数量由RecordCount 确定。
bReturnOK: 用户在成功接收到一批数据记录后,给bReturnOK 赋值为True该批数据记录会在设备上删除。若用户接收数据失败,给bReturnOK赋值为Fasle,该批记录会在2-3秒后重新主动上传到服务器,让服务器重新接收

请问妖哥此回调函数怎么用,需要自己写函数体吗?

[Quote=引用 5 楼 的回复:]
来吧,说说你那个DLL文件的导出表中有哪些内容?
[/Quote]
ccrun.com 2012-06-05
  • 打赏
  • 举报
回复
来吧,说说你那个DLL文件的导出表中有哪些内容?
skolar 2012-06-05
  • 打赏
  • 举报
回复
动态库中没有该函数名,然后我看了delphi的demo,里面就是这样写的,不懂,所以请教大大
[Quote=引用 3 楼 的回复:]
肿么个情况啊,先说说我1楼的代码管用否?
[/Quote]
ccrun.com 2012-06-05
  • 打赏
  • 举报
回复
肿么个情况啊,先说说我1楼的代码管用否?
skolar 2012-06-05
  • 打赏
  • 举报
回复
妖哥 我有一个delphi的代码 不知道如何弄成BCB的,帮忙看一下
TSerialType=Array [0..16] of Char;
FunOnRefreshDeviceStateBySerial = procedure(Dev_id: integer;Serial:TSerialType; State: integer; RecordCount: integer);stdcall;

FunOnDeviceLogin=procedure(Dev_id:integer;Serial:TSerialType;ip:PChar;port:integer;
var Heartbeat:integer);stdcall;
FunOnRecieveBatchRecordBySerial=procedure(Dev_id:integer;Serial:TSerialType;index:integer;RecordCount:integer;
Records: DeviceDataArray;var bReturnOK:boolean);stdcall;

FunOnRecievePhotoBySerial=procedure(Dev_id: integer;Serial:TSerialType;UpLoadIndex:integer;PhotoIndex:integer;
PhotoDataLen:integer;PhotoPos:integer;PerPhotoDataLen:integer;PhotoData:TBuf;var bReturnOK:boolean);stdcall;


procedure SetUpLoadProc(vOnDeviceLogin:FunOnDeviceLogin;
vOnRefreshDeviceState: FunOnRefreshDeviceStateBySerial;
vOnRecieveBatchRecord: FunOnRecieveBatchRecordBySerial); stdcall; external EastRiver_API;

这个怎么写成BCB啊

[Quote=引用 1 楼 的回复:]
首先确认一下DLL导出的函数名,到底是不是vOnDeviceLogin,然后:


C/C++ code
typedef void (CALLBACK *VONDEVICELOGIN)(int, TSerialType, char *, int , int &);

HINSTANCE hLib = ::LoadLibrary(TEXT("dll文件名"));
if (hLi……
[/Quote]
ccrun.com 2012-06-05
  • 打赏
  • 举报
回复
首先确认一下DLL导出的函数名,到底是不是vOnDeviceLogin,然后:

typedef void (CALLBACK *VONDEVICELOGIN)(int, TSerialType, char *, int , int &);

HINSTANCE hLib = ::LoadLibrary(TEXT("dll文件名"));
if (hLib)
{
VONDEVICELOGIN vOnDeviceLogin = (VONDEVICELOGIN)
::GetProcAddress(hLib, "vOnDeviceLogin");
if (vOnDeviceLogin)
{
vOnDeviceLogin(参数....);
}

::FreeLibrary(hLib);
}

13,824

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧