申し訳ありませんが、私は明確ではありません。C#コードでコールバックに渡されたC/C++ネイティブ構造体の使用方法
私はいくつかのビデオカメラ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 { int型Nチャネルを。 int iEvent; // SDK_EventCodeTypeを参照してください int iStatus; // 0:開始1:停止 SDK_SYSTEM_TIME SysTime; } C#のコードで
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;
}
MessCallBack機能がSDKによって呼び出されて、ここに私の問題は、私はSDK_ALAM_INFO構造としてalarmInfoを読み取ることができませんよということですので、私は、この構造体の値の内側から読み取ることができませんアラームが発生した時刻や発生したアラームの種類と同様です。
私は本当に助けに感謝します。先にありがとう
C/C++コードのようなものはありません。誰もあなたに別のことを教えてはいけません。マイクロソフトでさえない – Ron
C#のバージョンでは、文字列を返すこともできます。 – byxor
あなたはC#コードを表示する方が良いかもしれません。関数の翻訳で言葉や関数で言葉をすることはできません。 'DealwithAlarm'は' alarm '以外のものを扱っていますか? – doctorlove