在Delphi中调用VC动态库,回调函数如何定义

darkeye 2012-05-11 04:00:56
一个VC的dll,需要在delphi调用,其中有个回调函数的参数,不知道该怎么写,请大家帮忙看看
先看VC的声明

1、回调函数
typedef long (__stdcall *VOX_CVSA_CALLBACK_OnReportSwitchVideoResult)(int nMonNo,int nCamNo,long nResult,
const char *errInfo, long lParam);
typedef long (__stdcall *VOX_CVSA_CALLBACK_OnReportVideoMapping)(int nMonNo,int nCamNo, long lParam);

2、回调函数结构体
struct CVSA_NOTIFY{
VOX_CVSA_CALLBACK_OnReportSwitchVideoResult OnReportSwitchVideoResult;
long lOnReportSwitchVideoResultParam;

VOX_CVSA_CALLBACK_OnReportVideoMapping OnReportVideoMapping;
long lOnReportVideoMappingParam;
};

3、动态库函数
CLIENT_VIDEO_SERV_API long __stdcall VOX_CVSA_SetNotify(long hInstance, struct CVSA_NOTIFY *pNotify);


下面是根据上面的部分改的Delphi代码
1、回调函数
VOX_CVSA_CALLBACK_OnReportSwitchVideoResult =
Function (nMonNo: Integer; nCamNo: Integer; nResult: Integer; errInfo: PChar; lParam: Integer): Integer;

VOX_CVSA_CALLBACK_OnReportVideoMapping =
Function (nMonNo : Integer; nCamNo: Integer; lParam: Integer): Integer;

2、回调函数结构体
PCVSA_NOTIFY = ^TCVSA_NOTIFY;
TCVSA_NOTIFY = Record
OnReportSwitchVideoResult: VOX_CVSA_CALLBACK_OnReportSwitchVideoResult;
lOnReportSwitchVideoResultParam: Integer;

OnReportVideoMapping: VOX_CVSA_CALLBACK_OnReportVideoMapping;
lOnReportVideoMappingParam: Integer;
end;

3、动态库函数
Function VOX_CVSA_SetNotify(hInstance: Integer; pNotify: PCVSA_NOTIFY): Integer; stdcall; external 'VoxCVSA_SDK.dll' ;

-----------------------------------------------------------------------------------------------------------------------
我的实现如下:

1、先声明一个测试类
TVoxImpl = class
private
FCVSA_NOTIFY : PCVSA_NOTIFY ;
Function VideoResult(nMonNo: Integer; nCamNo: Integer; nResult: Integer; errInfo: PChar; lParam: Integer): Integer;
Function VideoMapping(nMonNo : Integer; nCamNo: Integer; lParam: Integer): Integer;
public
Constructor Create;
end;

2、在Create中注册回调函数
Procedrue TVoxImpl.Create()
begin
New(FCVSA_NOTIFY);

FCVSA_NOTIFY^.lOnReportSwitchVideoResultParam := 0;
FCVSA_NOTIFY^.lOnReportVideoMappingParam := 0;

****** 编译到下面这就提示错误了,[Incompatible types: regular procedure and method pointer]*******************
FCVSA_NOTIFY^.OnReportSwitchVideoResult := VideoResult;
FCVSA_NOTIFY^.OnReportVideoMapping := VideoMapping;

end;





请帮忙看看,这个回调函数到底该怎么弄啊!




...全文
232 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
darkeye 2012-05-11
  • 打赏
  • 举报
回复
自己解决了,原来不能是类函数,必须是单元函数。还是要谢谢你!
Corn1 2012-05-11
  • 打赏
  • 举报
回复
给你一段我自己在用的代码:
dll接口文件:
type
TAlarmCallBack = procedure(ResourceID: PChar; AlarmType: Integer; AlarmDetail: PChar; AlarmLevel: Integer; AlarmTime: PChar; Action: Integer; User: Pointer); cdecl;

function Plat_SubscribeAlarm(AlarmCallBack: TAlarmCallBack; User: Pointer; UserHandle: Integer): Integer; cdecl; external 'Platform.dll'; //这里用到回调函数

调用的地方:
interface
procedure AlarmCallBack(ResourceID: PChar; AlarmType: Integer; AlarmDetail: PChar;
AlarmLevel: Integer; AlarmTime: PChar; Action: Integer; User: Pointer);

implementation

procedure AlarmCallBack(ResourceID: PChar; AlarmType: Integer; AlarmDetail: PChar;
AlarmLevel: Integer; AlarmTime: PChar; Action: Integer; User: Pointer);
begin
HKOperator.RaiseAlarm(1, StrToInt(StrPas(ResourceID)), AlarmType, StrPas(AlarmDetail),
AlarmLevel, StrPas(AlarmTime), Action);
end;

function THKOperator.SubscribeAlarm: Boolean;
begin
Result := (Plat_SubscribeAlarm(@AlarmCallBack, nil, FUserHandle) = 0);
if Result then
WriteLogInfo(1, NOTICE, '告警订阅成功!')
else
WriteLogInfo(1, ERROR, '告警订阅失败:' + GetLastErrorInfo);
end;
RC 是 remote call 的缩写,顾名思义 RC32 为 32 位的远程调用接口,RC64 为 64 位 的远程调用接口,RC 基于TCP/IP 传输协议。 RC 分为二个部分:Client 端和 Server 端 1. Client 端的动态库名为 RC32c.dll/RC64c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为 RC32s.dll/RC64s.dll,负责接收Client端的请求并应答返回。 Client 端由三大类组成:Connection类、Command类和Fields类 1. Connection类主要负责与Server端的通讯和应答返回值的分发; 2. Command类主要负责命令参数编辑,提交及返回值读取操作; 3. Command执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection分发获取应答返回值; 4. Connection分发分为回调方式和查询方式,二者在一个Connection对象只能 属于其一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server类、Application类、Function类、Response类和Fields类 1. Server类主要负责与Client端的连接和数据通讯; 2. Application类主要负责Function的组织和Response的分发; 3. Function类主要负责Function的定义调用模式; 4. Response类主要负责Client端指定Function请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation针对Client的请求连接可以通过OnConnect和OnDisconnect回调函数 得到连接ID,也可以通过RCSAppGetEvent函数得到; 6. 若Function的调用模式不是查询模式,则Client的请求应答由Application的处 理线程调用执行,否则必须调用RCSAppGetEvent函数得到Client的请求 应答ID,然后通过应答ID取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 RC 压缩包含有如下文件: -------------------------------------------------------------------------------- \RC 3.0\_documents\RC 开发使用说明_v30.chm \RC 3.0\_documents\RC 开发使用说明_v30.pdf \RC 3.0\_exports\Delphi\RC32c.pas \RC 3.0\_exports\Delphi\RC32s.pas \RC 3.0\_exports\VC6\RC32c.lib \RC 3.0\_exports\VC6\RC32s.lib \RC 3.0\_exports\VC6\RCClient.h \RC 3.0\_exports\VC6\RCServer.h \RC 3.0\_exports\VS2008_x64\RC64c.lib \RC 3.0\_exports\VS2008_x64\RC64s.lib \RC 3.0\_exports\VS2008_x64\RCClient.h \RC 3.0\_exports\VS2008_x64\RCServer.h \RC 3.0\_linux\_rc32\librc32c.so \RC 3.0\_linux\_rc32\librc32s.so \RC 3.0\_linux\_rc32\RC32c.h \RC 3.0\_linux\_rc32\RC32s.h \RC 3.0\_linux\classes\client\CmdQueue.cpp \RC 3.0\_linux\classes\client\CmdQueue.h \RC 3.0\_linux\classes\client\RC32c.h \RC 3.0\_linux\classes\client\RCClientObj.cpp \RC 3.0\_linux\classes\client\RCClientObj.h \RC 3.0\_linux\classes\server\KYConnHandles.cpp \RC 3.0\_linux\classes\server\KYConnHandles.h \RC 3.0\_linux\classes\server\RC32s.h \RC 3.0\_linux\classes\server\RCServerObj.cpp \RC 3.0\_linux\classes\server\RCServerObj.h \RC 3.0\_linux\demo\source_test_rc-centos5.4.tar.gz \RC 3.0\_rc32\RC32c.dll \RC 3.0\_rc32\RC32s.dll \RC 3.0\_rc32\TestRCClient.exe \RC 3.0\_rc64\RC64c.dll \RC 3.0\_rc64\RC64s.dll \RC 3.0\classes\client\Delphi2006\CmdQueue.pas \RC 3.0\classes\client\Delphi2006\RC32c.pas \RC 3.0\classes\client\Delphi2006\RCClientObj.pas \RC 3.0\classes\client\VC++\CmdQueue.cpp \RC 3.0\classes\client\VC++\CmdQueue.h \RC 3.0\classes\client\VC++\RC32c.lib \RC 3.0\classes\client\VC++\RC64c.lib \RC 3.0\classes\client\VC++\RCClient.h \RC 3.0\classes\client\VC++\RCClientObj.cpp \RC 3.0\classes\client\VC++\RCClientObj.h \RC 3.0\classes\server\Delphi2006\ConnFileHandles.pas \RC 3.0\classes\server\Delphi2006\RC32s.pas \RC 3.0\classes\server\Delphi2006\RCServerObj.pas \RC 3.0\classes\server\Delphi2006\RespQueue.pas \RC 3.0\classes\server\VC++\RC32s.lib \RC 3.0\classes\server\VC++\RC64s.lib \RC 3.0\classes\server\VC++\RCServer.h \RC 3.0\classes\server\VC++\RCServerObj.cpp \RC 3.0\classes\server\VC++\RCServerObj.h \RC 3.0\demo\TestFields(delphi2006)\[工程: TestClient.dpr, TestServer.dpr] \RC 3.0\demo\TestRC32(VC6)\[工程: TestRC32c.dsp, TestRC32s.dsp] \RC 3.0\demo\TestRC64(VS2008)\[工程: TestRC64c.vcproj, TestRC64s.vcproj] --------------------------------------------------------------------------------
GCI32通用通讯接口 2.1.1.6 (build 2010.06.07) for Win32 & Linux FC9 GCI接口是跨平台的, 可以在Windows和Linux下使用, 也可以相互调用。里面包含Windows 下的VC6, Delphi调用源代码,以及Linux下的C++调用源代码。 SWGCI 是Synway General Communication Interface 的缩写,顾名思义SWGCI32 为32 位的 通用通讯接口,SWGCI32 基于TCP/IP 传输协议。 SWGCI32 分为二个部分:Client 端和Server 端 1. Client 端的动态库名为SWGCI32c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为SWGCI32s.dll,负责接收Client 端的请求并应答返回。 Client 端由三大类组成:Connection 类、Command 类和Fields 类 1. Connection 类主要负责与Server 端的通讯和应答返回值的分发; 2. Command 类主要负责命令参数编辑,提交及返回值读取操作; 3. Command 执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection 分发获取应答返回值; 4. Connection 分发分为回调方式和查询方式,二者在一个Connection 对象只能 属于其一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server 类、Application 类、Function 类、Response 类和Fields 类 1. Server 类主要负责与Client 端的连接和数据通讯; 2. Application 类主要负责Function 的组织和Response 的分发; 3. Function 类主要负责Function 的定义调用模式; 4. Response 类主要负责Client 端指定Function 请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation 针对Client 的请求连接可以通过OnConnect 和OnDisconnect 回调函数 得到连接ID,也可以通过GCIApplicationGetEvent 函数得到; 6. 若Function 的调用模式不是查询模式,则Client 的请求应答由Application 的处 理线程调用执行,否则必须调用GCIApplicationGetEvent 函数得到Client 的请求 应答ID,然后通过应答ID 取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。
GCI32通用通讯接口 2.1.1.2 (build 2009.11.19) for Win32 & Linux FC9 GCI接口是跨平台的, 可以在Windows和Linux下使用, 也可以相互调用。里面包含Windows 下的VC6, Delphi调用源代码,以及Linux下的C++调用源代码。 SWGCI 是Synway General Communication Interface 的缩写,顾名思义SWGCI32 为32 位的 通用通讯接口,SWGCI32 基于TCP/IP 传输协议。 SWGCI32 分为二个部分:Client 端和Server 端 1. Client 端的动态库名为SWGCI32c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为SWGCI32s.dll,负责接收Client 端的请求并应答返回。 Client 端由三大类组成:Connection 类、Command 类和Fields 类 1. Connection 类主要负责与Server 端的通讯和应答返回值的分发; 2. Command 类主要负责命令参数编辑,提交及返回值读取操作; 3. Command 执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection 分发获取应答返回值; 4. Connection 分发分为回调方式和查询方式,二者在一个Connection 对象只能 属于其一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server 类、Application 类、Function 类、Response 类和Fields 类 1. Server 类主要负责与Client 端的连接和数据通讯; 2. Application 类主要负责Function 的组织和Response 的分发; 3. Function 类主要负责Function 的定义调用模式; 4. Response 类主要负责Client 端指定Function 请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation 针对Client 的请求连接可以通过OnConnect 和OnDisconnect 回调函数 得到连接ID,也可以通过GCIApplicationGetEvent 函数得到; 6. 若Function 的调用模式不是查询模式,则Client 的请求应答由Application 的处 理线程调用执行,否则必须调用GCIApplicationGetEvent 函数得到Client 的请求 应答ID,然后通过应答ID 取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。
GCI32通用通讯接口 2.1.1.7 (build 2010.06.24) for Win32 & CentOS5.4 GCI接口是跨平台的, 可以在Windows和Linux下使用, 也可以相互调用。里面包含Windows 下的VC6, Delphi调用源代码,以及Linux下的C++调用源代码 SWGCI32 2.1.1.0 (build 2009.08.18) SWGCI 是Synway General Communication Interface 的缩写,顾名思义SWGCI32 为32 位的 通用通讯接口,SWGCI32 基于TCP/IP 传输协议。 SWGCI32 分为二个部分:Client 端和Server 端 1. Client 端的动态库名为SWGCI32c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为SWGCI32s.dll,负责接收Client 端的请求并应答返回。 Client 端由三大类组成:Connection 类、Command 类和Fields 类 1. Connection 类主要负责与Server 端的通讯和应答返回值的分发; 2. Command 类主要负责命令参数编辑,提交及返回值读取操作; 3. Command 执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection 分发获取应答返回值; 4. Connection 分发分为回调方式和查询方式,二者在一个Connection 对象只能 属于其一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server 类、Application 类、Function 类、Response 类和Fields 类 1. Server 类主要负责与Client 端的连接和数据通讯; 2. Application 类主要负责Function 的组织和Response 的分发; 3. Function 类主要负责Function 的定义调用模式; 4. Response 类主要负责Client 端指定Function 请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation 针对Client 的请求连接可以通过OnConnect 和OnDisconnect 回调函数 得到连接ID,也可以通过GCIApplicationGetEvent 函数得到; 6. 若Function 的调用模式不是查询模式,则Client 的请求应答由Application 的处 理线程调用执行,否则必须调用GCIApplicationGetEvent 函数得到Client 的请求 应答ID,然后通过应答ID 取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields 类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。
版本: 3.0.2.1 (build 2013.11.02) RC 是 remote call 的缩写,顾名思义 RC32 为 32 位的远程调用接口,RC64 为 64 位 的远程调用接口,RC 基于TCP/IP 传输协议。 RC 分为二个部分:Client 端和 Server 端 1. Client 端的动态库名为 RC32c.dll/RC64c.dll,负责命令的发送与应答返回值的分发; 2. Server 端的动态库名为 RC32s.dll/RC64s.dll,负责接收Client端的请求并应答返回。 Client 端由三大类组成:Connection类、Command类和Fields类 1. Connection类主要负责与Server端的通讯和应答返回值的分发; 2. Command类主要负责命令参数编辑,提交及返回值读取操作; 3. Command执行请求可以阻塞等待应答返回值,也可以非阻塞立即返回,通过连接 Connection分发获取应答返回值; 4. Connection分发分为回调方式和查询方式,二者在一个Connection对象只能 属于其一种方式,而查询方式还可以分为阻塞和非阻塞读取; 5. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 Server 端由五大类组成:Server类、Application类、Function类、Response类和Fields类 1. Server类主要负责与Client端的连接和数据通讯; 2. Application类主要负责Function的组织和Response的分发; 3. Function类主要负责Function的定义调用模式; 4. Response类主要负责Client端指定Function请求的处理,如参数读取、返回值 编辑及提交; 5. Applcation针对Client的请求连接可以通过OnConnect和OnDisconnect回调函数 得到连接ID,也可以通过RCSAppGetEvent函数得到; 6. 若Function的调用模式不是查询模式,则Client的请求应答由Application的处 理线程调用执行,否则必须调用RCSAppGetEvent函数得到Client的请求 应答ID,然后通过应答ID取参数和设置返回值等等操作,这时处理应答由外部程 序自己处理; 7. Fields类主要负责数据库字段值的组包和拆包,以及字段定义集的组包和拆包。 RC 压缩包含有如下文件: -------------------------------------------------------------------------------- \RC 3.0\_documents\RC 开发使用说明_v30.chm \RC 3.0\_documents\RC 开发使用说明_v30.pdf \RC 3.0\_exports\Delphi\RC32c.pas \RC 3.0\_exports\Delphi\RC32s.pas \RC 3.0\_exports\VC6\RC32c.lib \RC 3.0\_exports\VC6\RC32s.lib \RC 3.0\_exports\VC6\RCClient.h \RC 3.0\_exports\VC6\RCServer.h \RC 3.0\_exports\VS2008_x64\RC64c.lib \RC 3.0\_exports\VS2008_x64\RC64s.lib \RC 3.0\_exports\VS2008_x64\RCClient.h \RC 3.0\_exports\VS2008_x64\RCServer.h \RC 3.0\_linux\_rc32\librc32c.so \RC 3.0\_linux\_rc32\librc32s.so \RC 3.0\_linux\_rc32\RC32c.h \RC 3.0\_linux\_rc32\RC32s.h \RC 3.0\_linux\classes\client\CmdQueue.cpp \RC 3.0\_linux\classes\client\CmdQueue.h \RC 3.0\_linux\classes\client\RC32c.h \RC 3.0\_linux\classes\client\RCClientObj.cpp \RC 3.0\_linux\classes\client\RCClientObj.h \RC 3.0\_linux\classes\server\KYConnHandles.cpp \RC 3.0\_linux\classes\server\KYConnHandles.h \RC 3.0\_linux\classes\server\RC32s.h \RC 3.0\_linux\classes\server\RCServerObj.cpp \RC 3.0\_linux\classes\server\RCServerObj.h \RC 3.0\_linux\demo\source_test_rc-centos5.4.tar.gz \RC 3.0\_rc32\RC32c.dll \RC 3.0\_rc32\RC32s.dll \RC 3.0\_rc32\TestRCClient.exe \RC 3.0\_rc64\RC64c.dll \RC 3.0\_rc64\RC64s.dll \RC 3.0\classes\client\Delphi2006\CmdQueue.pas \RC 3.0\classes\client\Delphi2006\RC32c.pas \RC 3.0\classes\client\Delphi2006\RCClientObj.pas \RC 3.0\classes\client\VC++\CmdQueue.cpp \RC 3.0\classes\client\VC++\CmdQueue.h \RC 3.0\classes\client\VC++\RC32c.lib \RC 3.0\classes\client\VC++\RC64c.lib \RC 3.0\classes\client\VC++\RCClient.h \RC 3.0\classes\client\VC++\RCClientObj.cpp \RC 3.0\classes\client\VC++\RCClientObj.h \RC 3.0\classes\server\Delphi2006\ConnFileHandles.pas \RC 3.0\classes\server\Delphi2006\RC32s.pas \RC 3.0\classes\server\Delphi2006\RCServerObj.pas \RC 3.0\classes\server\Delphi2006\RespQueue.pas \RC 3.0\classes\server\VC++\RC32s.lib \RC 3.0\classes\server\VC++\RC64s.lib \RC 3.0\classes\server\VC++\RCServer.h \RC 3.0\classes\server\VC++\RCServerObj.cpp \RC 3.0\classes\server\VC++\RCServerObj.h \RC 3.0\demo\TestFields(delphi2006)\[工程: TestClient.dpr, TestServer.dpr] \RC 3.0\demo\TestRC32(VC6)\[工程: TestRC32c.dsp, TestRC32s.dsp] \RC 3.0\demo\TestRC64(VS2008)\[工程: TestRC64c.vcproj, TestRC64s.vcproj] --------------------------------------------------------------------------------

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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