【发布时间】:2017-11-01 13:22:01
【问题描述】:
对不起,如果我不清楚。
我正在使用一些摄像机 SDK,因此需要提醒一些警报,例如某些物体阻挡了摄像机视图等。 SDK 提供订阅功能以获取警报。 该功能是休闲的:
H264_DVR_SetDVRMessCallBack(fMessCallBack cbAlarmcallback, unsigned long lUser);
cbAlarmCallback 是闲置的:
bool __stdcall MessCallBack(long lLoginID, char *pBuf,
unsigned long dwBufLen, long dwUser)
{
return DealwithAlarm(lLoginID,pBuf,dwBufLen);
}
//Note here char *pBuf, in c++ its declared as char* but it needs to be memcpy to SDK_AlarmInfo struct, this is declared in c++ as fallows:
//alarm information
typedef struct SDK_ALARM_INFO
{
int nChannel;
int iEvent; ///< refer to SDK_EventCodeTypes
int iStatus; ///< 0: start 1: stop
SDK_SYSTEM_TIME SysTime;
}SDK_AlarmInfo;
typedef struct SDK_SYSTEM_TIME{
int year;///< year
int month;///< month,January = 1, February = 2, and so on.
int day;///< day
int wday;///< week, Sunday = 0, Monday = 1, and so on
int hour;///< hour
int minute;///< minute
int second;///< second
int isdst;///< DST(daylight saving time) flag, Yes = 1, No = 0
}SDK_SYSTEM_TIME;
DealwithAlarm 功能:
void CClientDemoDlg::DealwithAlarm(long lDevcID, char* pBuf , DWORD dwLen)
{
SDK_AlarmInfo alarmInfo;
memcpy ( &alarmInfo, pBuf, dwLen );
if ( (SDK_EVENT_CODE_NET_ALARM == alarmInfo.iEvent ))
{
// Do something
}
}
所有这些在 c++ 中都可以正常工作,并且 char* pBuf 转换为 SDK_AlarmInfo 完全没有问题。
在 C# 中我正在做:
public delegate bool fMessCallBack(int lLoginID, byte[] pBuf, uint dwBufLen, IntPtr dwUser);
[DllImport("NetSdk.dll")]
public static extern void H264_DVR_SetDVRMessCallBack(fMessCallBack cbAlarmcallback, IntPtr lUser);
公共结构 SDK_ALARM_INFO { 诠释 nChannel; 诠释 iEvent; //参考SDK_EventCodeType 诠释 iStatus; // 0:开始 1:停止 SDK_SYSTEM_TIME 系统时间; }
public struct SDK_SYSTEM_TIME
{
public int year;//
public int month;//January = 1, February = 2, and so on.
public int day;//
public int wday;//Sunday = 0, Monday = 1, and so on
public int hour;//
public int minute;//
public int second;//
public int isdst;//
}
public enum SDK_EVENT_CODE_TYPES
{
SDK_EVENT_CODE_INIT = 0,
SDK_EVENT_CODE_LOCAL_ALARM = 1, //local alarm
SDK_EVENT_CODE_NET_ALARM, //network alarm
SDK_EVENT_CODE_MANUAL_ALARM, //manual alarm
SDK_EVENT_CODE_VIDEO_MOTION, //motion detect
SDK_EVENT_CODE_VIDEO_LOSS, //loss detect
SDK_EVENT_CODE_VIDEO_BLIND, //blind detect
}
public int Init()
{
fMessCallBack msgcallback = new fMessCallBack(MessCallBack);
H264_DVR_SetDVRMessCallBack(msgcallback, dwUser);
}
bool MessCallBack(int lLoginID, byte[] pBuf, uint dwBufLen, IntPtr dwUser)
{
SDK_ALARM_INFO alarmInfo;
//here i should translate pBuf param into alarm Info
return true;
}
在 c# 代码中,SDK 正在调用 MessCallBack 函数,我的问题是我无法将 alarmInfo 读取为 SDK_ALAM_INFO 结构,因此我无法从该结构中读取值,例如警报的时间发生或发生的警报类型。
我将非常感谢任何帮助。提前致谢
【问题讨论】:
-
没有 C/C++ 代码之类的东西。让没有人以不同的方式告诉你。甚至微软也不行。
-
在C#版本中,还不如只返回一个字符串。
-
您最好也展示您的 C# 代码 - 您将无法逐字逐句/逐函数翻译 - 不同的语言做不同的事情。
DealwithAlarm是否处理过alarm以外的任何事情? -
我觉得我们错过了很多关于你最初是如何来到这里的背景信息。
pBuf来自哪里?无论如何,只需memcpy进入 POD 的安全性令人怀疑,在这种情况下实际上存在安全风险,因为dwLen可能大于sizeof(alarmInfo),从而导致经典的缓冲区溢出漏洞。 -
C#中
memcpy的翻译是使用赋值运算符。
标签: c# c++ .net interop marshalling