现有C++函数:
BOOL NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack,void *pUser);这个函数传入的参数是回调函数:
Callback Function
typedef void(CALLBACK *MSGCallBack)(
LONG lCommand,
NET_DVR_ALARMER *pAlarmer,
char *pAlarmInfo,
DWORD dwBufLen,
void *pUser
);
而这个回调函数中的参数又有一个结构体:
struct{
BYTE byUserIDValid;
BYTE bySerialValid;
BYTE byVersionValid;
BYTE byDeviceNameValid;
BYTE byMacAddrValid;
BYTE byLinkPortValid;
BYTE byDeviceIPValid;
BYTE bySocketIPValid;
LONG lUserID;
BYTE sSerialNumber[SERIALNO_LEN];
DWORD dwDeviceVersion;
char sDeviceName[NAME_LEN];
BYTE byMacAddr[MACADDR_LEN];
WORD wLinkPort;
char sDeviceIP[128];
char sSocketIP[128];
BYTE byIpProtocol;
BYTE byRes2[11];
}NET_DVR_ALARMER,*LPNET_DVR_ALARMER;该怎么样翻译成C#语言的类?我自己做了一个回调不成功,请高手帮忙灰常感谢 public class DataSyncHelper
{ //注册回调函数,接收设备报警消息等。
[DllImport("HCNetSDK.dll", CharSet = CharSet.Ansi)]
public static extern bool NET_DVR_SetDVRMessageCallBack_V30([MarshalAs(UnmanagedType.FunctionPtr)]MSGCallBack fMessageCallBack, IntPtr pUser);
}
//定义回调函数中的委托
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MSGCallBack(long lCommand, ref NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser);
//回调函数的结构体
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_ALARMER
{
public byte byUserIDValid; /* userid是否有效 0-无效,1-有效 */
public byte bySerialValid; /* 序列号是否有效 0-无效,1-有效 */
public byte byVersionValid; /* 版本号是否有效 0-无效,1-有效 */
public byte byDeviceNameValid; /* 设备名字是否有效 0-无效,1-有效 */
public byte byMacAddrValid; /* MAC地址是否有效 0-无效,1-有效 */
public byte byLinkPortValid; /* login端口是否有效 0-无效,1-有效 */
public byte byDeviceIPValid; /* 设备IP是否有效 0-无效,1-有效 */
public byte bySocketIPValid; /* socket ip是否有效 0-无效,1-有效 */
public long lUserID; /* NET_DVR_Login()返回值, 布防时有效 */
[MarshalAs(UnmanagedType.U8, SizeConst= 48)]
public byte sSerialNumber;
public uint dwDeviceVersion; /* 版本信息 高16位表示主版本,低16位表示次版本*/
[MarshalAs(UnmanagedType.TBStr, SizeConst= 32)]
public char sDeviceName; /* 设备名字 */
[MarshalAs(UnmanagedType.U8, SizeConst= 16)]
public byte byMacAddr; /* MAC地址 */
public int wLinkPort; /* link port */
[MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
public char sDeviceIP; /* IP地址 */
[MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
public char sSocketIP; /* 报警主动上传时的socket IP地址 */
public byte byIpProtocol; /* Ip协议 0-IPV4, 1-IPV6 */
[MarshalAs(UnmanagedType.U8, SizeConst= 11)]
public byte byRes2;
}
调用时时:
static System.IntPtr intptr = IntPtr.Zero;
//委托类型变量
static MSGCallBack AsyncCallback = null;
static void Main(string[] args)
{
AsyncCallback = AsyncCallbackSend;
// 注册回调函数,接收设备报警消息等。
bool back = DataSyncHelper.NET_DVR_SetDVRMessageCallBack_V30(AsyncCallback, intptr); } static void AsyncCallbackSend(long lCommand, ref NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser)
{
Console.WriteLine("AAA");
}
一直不能调试一直不能打印AAA,本人用的C++做的可以成功但到C#里面就。高人指点。。
BOOL NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack,void *pUser);这个函数传入的参数是回调函数:
Callback Function
typedef void(CALLBACK *MSGCallBack)(
LONG lCommand,
NET_DVR_ALARMER *pAlarmer,
char *pAlarmInfo,
DWORD dwBufLen,
void *pUser
);
而这个回调函数中的参数又有一个结构体:
struct{
BYTE byUserIDValid;
BYTE bySerialValid;
BYTE byVersionValid;
BYTE byDeviceNameValid;
BYTE byMacAddrValid;
BYTE byLinkPortValid;
BYTE byDeviceIPValid;
BYTE bySocketIPValid;
LONG lUserID;
BYTE sSerialNumber[SERIALNO_LEN];
DWORD dwDeviceVersion;
char sDeviceName[NAME_LEN];
BYTE byMacAddr[MACADDR_LEN];
WORD wLinkPort;
char sDeviceIP[128];
char sSocketIP[128];
BYTE byIpProtocol;
BYTE byRes2[11];
}NET_DVR_ALARMER,*LPNET_DVR_ALARMER;该怎么样翻译成C#语言的类?我自己做了一个回调不成功,请高手帮忙灰常感谢 public class DataSyncHelper
{ //注册回调函数,接收设备报警消息等。
[DllImport("HCNetSDK.dll", CharSet = CharSet.Ansi)]
public static extern bool NET_DVR_SetDVRMessageCallBack_V30([MarshalAs(UnmanagedType.FunctionPtr)]MSGCallBack fMessageCallBack, IntPtr pUser);
}
//定义回调函数中的委托
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void MSGCallBack(long lCommand, ref NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser);
//回调函数的结构体
[StructLayout(LayoutKind.Sequential)]
public struct NET_DVR_ALARMER
{
public byte byUserIDValid; /* userid是否有效 0-无效,1-有效 */
public byte bySerialValid; /* 序列号是否有效 0-无效,1-有效 */
public byte byVersionValid; /* 版本号是否有效 0-无效,1-有效 */
public byte byDeviceNameValid; /* 设备名字是否有效 0-无效,1-有效 */
public byte byMacAddrValid; /* MAC地址是否有效 0-无效,1-有效 */
public byte byLinkPortValid; /* login端口是否有效 0-无效,1-有效 */
public byte byDeviceIPValid; /* 设备IP是否有效 0-无效,1-有效 */
public byte bySocketIPValid; /* socket ip是否有效 0-无效,1-有效 */
public long lUserID; /* NET_DVR_Login()返回值, 布防时有效 */
[MarshalAs(UnmanagedType.U8, SizeConst= 48)]
public byte sSerialNumber;
public uint dwDeviceVersion; /* 版本信息 高16位表示主版本,低16位表示次版本*/
[MarshalAs(UnmanagedType.TBStr, SizeConst= 32)]
public char sDeviceName; /* 设备名字 */
[MarshalAs(UnmanagedType.U8, SizeConst= 16)]
public byte byMacAddr; /* MAC地址 */
public int wLinkPort; /* link port */
[MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
public char sDeviceIP; /* IP地址 */
[MarshalAs(UnmanagedType.TBStr, SizeConst= 128)]
public char sSocketIP; /* 报警主动上传时的socket IP地址 */
public byte byIpProtocol; /* Ip协议 0-IPV4, 1-IPV6 */
[MarshalAs(UnmanagedType.U8, SizeConst= 11)]
public byte byRes2;
}
调用时时:
static System.IntPtr intptr = IntPtr.Zero;
//委托类型变量
static MSGCallBack AsyncCallback = null;
static void Main(string[] args)
{
AsyncCallback = AsyncCallbackSend;
// 注册回调函数,接收设备报警消息等。
bool back = DataSyncHelper.NET_DVR_SetDVRMessageCallBack_V30(AsyncCallback, intptr); } static void AsyncCallbackSend(long lCommand, ref NET_DVR_ALARMER pAlarmer, string pAlarmInfo, int dwBufLen, IntPtr pUser)
{
Console.WriteLine("AAA");
}
一直不能调试一直不能打印AAA,本人用的C++做的可以成功但到C#里面就。高人指点。。
解决方案 »
- c#调用excel打印的问题。请高手相助!
- 在应使用条件的上下文(在'|1|'附近)中指定了非布尔类型的表达式!求高手进来解答!!!
- 帮忙看下分页这样写好不好?
- sqlDependency的onChange事件触发时,总是提示通知事件原因为Invalid
- 如何使用ADO.NET对GridView进行编辑和删除,用三层!
- 泛型的重载函数报错:未将对象引用设置到对象的实例(非常奇怪)
- 听别人说过关于DATASET的技术,但不知道怎么实现.
- 怎样屏蔽事件
- ===求c#关机的源码,实现关机无提示
- 怎样实现FTP下载?
- C#用Socket进行TCP通信,如何接收并解析Xml数据
- C# backGrundWorker上传图片并且显示进度条
将设置报警回调函数NET_DVR_SetDVRMessageCallBack_V30和NET_DVR_StartListen_V30的最后一个参数明确。 //最后一个参数原来为 IntPtr pUser 改为 ref int pUser); //IntPtr pUser);
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, ref int pUser); //启动监听,接收设备主动上传的报警等信息(支持多线程)。
[DllImport("HCNetSDK.dll")]
public static extern int NET_DVR_StartListen_V30(string sLocalIP, ushort wLocalPort, MSGCallBack DataCallback, ref int pUserData); //回调函数
public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, ref int pUser); //IntPtr pUser); NET_DVR_StartListen_V30
定义一个VIDEO类,public class VIDEO
{ ............. public int m_lUserID = -1; private static CHCNetSDK.MSGCallBack MsgBack; ........ public void Login()
{ //设备注册CHCNetSDK.NET_DVR_Login_V30(........) } //启动监听报警
public void StartListen()
{ //设置报警回调函数
MsgBack = new CHCNetSDK.MSGCallBack(msgCallBack); //回调函数实例化
CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(MsgBack, ref m_lUserID); //开始监听 //监控报警信息线程
Thread myAlarmThread = new Thread(new ThreadStart(ListenAlarmThreadProc));
myAlarmThread.Priority = ThreadPriority.Lowest;
myAlarmThread.Start();
} //监听报警线程函数
private void ListenAlarmThreadProc()
{
string sLocalIP = GetIP(); //***PC机本地IP地址,设备中服务器参数:“管理主机IP地址”,必须和此处一致
ushort wLocalPort = 8001; //***PC本地监听端口号。由用户设置,必须和设备中服务器参数:“管理主机端口号”一致 //CHCNetSDK.MSGCallBack MsgBack = new CHCNetSDK.MSGCallBack(msgCallBack); //回调函数实例化
CHCNetSDK.NET_DVR_StartListen_V30(sLocalIP, wLocalPort, MsgBack, ref m_lUserID);
} //报警回调函数
private void msgCallBack(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, ref int pUser)
{ //报警发生时你要执行的操作 ................ } 调用:private VIDEO video;...........video.Login(); //注册设备 video.StartListen(); //启动监听报警