c#怎么调用vc的DLL里的回调函数?

Hi3号 2012-04-18 05:13:30
IP_NET_DVR_SetStatusEventCallBack(设置状态告警事件回调函数)
函数原型:
LONG __stdcall IP_NET_DVR_SetStatusEventCallBack(StatusEventCallBack fStatusEventCallBack,void * pUser);
功能:
设置设备状态变化、或者有接收到事件、告警时的回调函数。
参数:
fStatusEventCallBack:回调用函数,声明原型为:typedef LONG(CALLBACK *StatusEventCallBack)(LONG lUser,LONG nStateCode,char *pResponse,void *pUser);
其中参数意义为:
lUser:标识是哪个设备
nStateCode:事件类型,值有如下:
enum enumNetSatateEvent
{
EVENT_CONNECTING,//连接中
EVENT_CONNECTOK,//连接成功
EVENT_CONNECTFAILED,//连接失败
EVENT_SOCKETERROR,//sock失败
EVENT_LOGINOK,//登录成功
EVENT_LOGINFAILED,//登录失败
EVENT_STARTAUDIOOK,//对讲启动成功
EVENT_STARTAUDIOFAILED,//对讲启动失败
EVENT_STOPAUDIOOK,//停止对讲成功
EVENT_STOPAUDIOFAILED,//停止对讲失败
EVENT_SENDPTZOK,//发送云台控制命令成功
EVENT_SENDPTZFAILED,//发送云台控制命令失败
EVENT_SENDAUXOK,//发送辅助通道成功
EVENT_SENDAUXFAILED,//发送辅助通道失败
EVENT_UPLOADOK,//上传文件成功
EVENT_UPLOADFAILED,//上传文件失败
EVENT_DOWNLOADOK,//下载成功
EVENT_DOWNLOADFAILED,//下载失败
EVENT_REMOVEOK,//删除文件成功
EVENT_REMOVEFAILED,//删除文件失败
EVENT_SENDPTZERROR,//云台操作失败
EVENT_PTZPRESETINFO,//预置点信息
EVNET_PTZNOPRESETINFO,//没有预置点
EVENT_PTZALARM,//告警信息
EVENT_RECVVIDEOPARAM,//视频参数返回
EVENT_RECVAUDIOPARAM,//音频参数返回
EVENT_CONNECTRTSPERROR,//请求实时视频失败
EVENT_CONNECTRTSPOK,//读求实时视频成功
EVENT_RTSPTHREADEXIT//请求实时视频线程结束
};
其中nStateCode= EVENT_PTZALARM时,pResponse中的alarm_code表示告警类型,定义如下
1 : 设备下线
2 : 设备上线
3 : USB接上
4 : USB拔出
5 : SD卡1接上
6 : SD卡1拔出
7 : SD卡2接上
8 : SD卡2拔出
9 : USB存储空间不足
10: SD卡1存储空间不足
11: SD卡2存储空间不足
12: 视频丢失
13: 视频遮挡
14: 图像移动告警
15: IO由高到低触发
16: IO由低到高触发
17: 空间不足告警
18: 录像启动成功
19: 录像结束
20: 录像启动失败

pResponse:相关XML数据
pUser:调用回调时,将为参数void *pUser
返回值:
返回0表示成功

----------------------------------------------------------------------------------------
上为dll文档,求指点。
...全文
497 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
nvshenxp 2012-04-20
  • 打赏
  • 举报
回复
C++中的回调函数对应到C#中应该是委托所以:
        
/// <summary>
/// typedef LONG(CALLBACK *StatusEventCallBack)(LONG lUser,LONG nStateCode,char *pResponse,void *pUser);
/// </summary>
public delegate int StatusEventCallBack(int lUser, int nStateCode,string pResponse,IntPtr pUser);
足球中国 2012-04-19
  • 打赏
  • 举报
回复
应该定义个委托就可以了。vb.net address就是的。
郑沐洋 2012-04-19
  • 打赏
  • 举报
回复
(1)C#编写DLL程序
建立C#编写的DLL程序AddDll,项目类型为:类库
程序代码:
using System;
using System.Collections.Generic;
using System.Text;
namespace AddDll
{
public class Add
{
public int iadd(int a, int b)
{
int c = a + b;
return c;
}
}
}
(2)C++编写调用程序
建立C++的Win32控制台应用程序UseDll,项目类型为:Win32控制台应用程序
配置:右键点击解决方案资源管理器中的UseDll,选择“属性”,将公共语言运行库支持设置为“公共语言运行库支持(/clr)”
程序代码:
 #include "stdafx.h"
#include "stdio.h"
#using "..\debug\AddDll.dll"
using namespace AddDll;
int _tmain(int argc, _TCHAR* argv[])
{
int result;
Add ^add = gcnew Add();
result = add->iadd(10,90);
printf("%d",result);
scanf("%s");
return 0;
}
Hi3号 2012-04-19
  • 打赏
  • 举报
回复
当在状态回调函数中收到EVENT_RECVVIDEOPARAM和EVENT_RECVAUDIOPARAM事件时,分别调用TPS_OpenStream初始化播放控件,并调用TPS_Play进入开始播放状态。一般这种回调收到事件我在哪个地方写代码呢?对这种机制不太明白。[Quote=引用 4 楼 的回复:]

在C#中将回调函数声明为委托,委托的返回类型、参数个数、参数类型与VCDLL的回调函数一致。
特别注意:C#在调用时需要将委托声明为静态的类成员变量。因为委托是托管代码,会被垃圾回收机制回收,而VCDLL函数是非托管代码,且回调需要委托才能正常运行,如果委托被回收,回调函数将会出错。
[/Quote]
Hi3号 2012-04-19
  • 打赏
  • 举报
回复
当在状态回调函数中收到EVENT_RECVVIDEOPARAM和EVENT_RECVAUDIOPARAM事件时,分别调用TPS_OpenStream初始化播放控件,并调用TPS_Play进入开始播放状态。一般这种回调收到事件我在哪个地方写代码呢?对这种机制不太明白。[Quote=引用 1 楼 的回复:]

太复杂了,不过如果dll需要一个函数指针作为参数,你可以把一个c#的委托传给它,注意参数返回值对应就行,
[/Quote]
小志 2012-04-18
  • 打赏
  • 举报
回复
在C#中将回调函数声明为委托,委托的返回类型、参数个数、参数类型与VCDLL的回调函数一致。
特别注意:C#在调用时需要将委托声明为静态的类成员变量。因为委托是托管代码,会被垃圾回收机制回收,而VCDLL函数是非托管代码,且回调需要委托才能正常运行,如果委托被回收,回调函数将会出错。
fancystyle 2012-04-18
  • 打赏
  • 举报
回复
1.如果你的回调不多,或结构体不复杂.使用
http://www.pinvoker.com/Downloads.aspx
插件导出C#的函数声明

2.
用C/C++ 再封装下那个DLL,简化函数接口.再用C#调简化后的DLL接口.
wy811007 2012-04-18
  • 打赏
  • 举报
回复
添加引用 然后就可以调用里面函数了吧
stonespace 2012-04-18
  • 打赏
  • 举报
回复
太复杂了,不过如果dll需要一个函数指针作为参数,你可以把一个c#的委托传给它,注意参数返回值对应就行,

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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