最近在用vb結合海康的dvr做視頻監控的專案,預覽、控制球機都可以了,但是想捕獲攝像頭的報警資訊時用到回呼函式,在vb中不知如何轉換了。
vc的實作方法是:
typedef void (CALLBACK *MSGCallBack)(LONG lCommand, NET_DVR_ALARMER *pAlarmer, char *pAlarmInfo, DWORD dwBufLen, void* pUser);
NET_DVR_API BOOL __stdcall NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, void* pUser);
我在vb中這樣寫了:Public Declare Function NET_DVR_SetDVRMessageCallBack_V30 Lib "HCNETSDK.dll" ( _
ByVal fMessageCallBack As MSGCallBack, _
ByVal pUser As Long _
) As Boolean
Public Sub MSGCallBack( _
ByVal lCommand As Long, _
ByVal dwDataType As Long, _
ByVal dwBufSize As Long, _
ByVal pUser As Long)
End Sub
但是, ByVal fMessageCallBack As MSGCallBack, _報錯,請問哪位能指教一下,謝謝。
uj5u.com熱心網友回復:
樓主,你試下這樣行不:' 標準模塊中的代碼:
Public Declare Function NET_DVR_SetDVRMessageCallBack_V30 Lib "HCNETSDK.dll" ( _
ByVal fMessageCallBack As Long, ByVal pUser As Long) As Boolean
Public Sub MSGCallBack( _
ByVal lCommand As Long, _
ByVal dwDataType As Long, _
ByVal dwBufSize As Long, _
ByVal pUser As Long)
' 這個函式的具體實作…………
' .......
' .......
' .......
' .......
End Sub
' 示例:
Private Sub Command1_Click()
Dim retVal As Boolean
' NET_DVR_SetDVRMessageCallBack_V30( ) 呼叫示例, xxxxx按你的實際情況寫
retVal = NET_DVR_SetDVRMessageCallBack_V30(AddressOf MSGCallBack, xxxxx)
End Sub
uj5u.com熱心網友回復:
謝謝,我也像這樣改了試過,但還是有錯誤,NET_DVR_SetDVRMessageCallBack_V30(AddressOf MSGCallBack, xxxxx)到這一步就會非法跳出子函式了。我是這樣寫的 If NET_DVR_SetDVRMessageCallBack_V30(AddressOf MSGCallBack, IntPtr.Zero) Then' {
Debug.Print "NET_DVR_SetDVRMessageCallBack_V30 Succ"
' }
c#有個例子是這樣實作的:
m_falarmData = new CHCNetSDK.MSGCallBack(MsgCallback);
if (CHCNetSDK.NET_DVR_SetDVRMessageCallBack_V30(m_falarmData, IntPtr.Zero))
{
DebugInfo("NET_DVR_SetDVRMessageCallBack_V30 Succ");
}
else
{
uint i = CHCNetSDK.NET_DVR_GetLastError();
DebugInfo("NET_DVR_SetDVRMessageCallBack_V30 Fail");
}
/*********************************************************
Function: MSGCallBack
Desc: (回呼函式)
Input:
Output:
Return:
**********************************************************/
public delegate void MSGCallBack(int lCommand, ref NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser);
[DllImport("HCNetSDK.dll")]
public static extern bool NET_DVR_SetDVRMessageCallBack_V30(MSGCallBack fMessageCallBack, IntPtr pUser);
public void MsgCallback(int lCommand, ref CHCNetSDK.NET_DVR_ALARMER pAlarmer, IntPtr pAlarmInfo, uint dwBufLen, IntPtr pUser)
{
MyDebugInfo AlarmInfo = new MyDebugInfo(DebugInfo);
switch (lCommand)
{
case CHCNetSDK.COMM_ALARM:
ProcessCommAlarm(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
case CHCNetSDK.COMM_ALARM_V30:
ProcessCommAlarm_V30(ref pAlarmer, pAlarmInfo, dwBufLen, pUser);
break;
case CHCNetSDK.COMM_ALARM_RULE:
this.BeginInvoke(AlarmInfo, "COMM_ALARM_RULE");
break;
case CHCNetSDK.COMM_TRADEINFO:
this.BeginInvoke(AlarmInfo, "COMM_TRADEINFO");
break;
case CHCNetSDK.COMM_IPCCFG:
this.BeginInvoke(AlarmInfo, "COMM_IPCCFG");
break;
case CHCNetSDK.COMM_IPCCFG_V31:
this.BeginInvoke(AlarmInfo, "COMM_IPCCFG_V31");
break;
default:
break;
}
}
uj5u.com熱心網友回復:
你那個 IntPtr.Zero 是什么東東???
按函式原型的“引數”來看,應該是一個“用戶名字串”的指標啊……
uj5u.com熱心網友回復:
我跟蹤了c#的例子,IntPtr.Zero就是0uj5u.com熱心網友回復:
你也做過海康dvr的二次開發?能參考一下你的代碼嗎?(主要就是獲取報警通道號這塊)我是初次接觸,對vb還不太熟悉,但是已有專案是vb開發的,所以有點難度。[email protected]uj5u.com熱心網友回復:
我沒搞過這些,寫代碼是業余愛好罷了。uj5u.com熱心網友回復:
那你也可以傳個 0 給它,試試啊。
還有,我很懷疑是你的 MSGCallBack( )中處理不正確造成的錯誤。
你可以先試下,把它內部的代碼全部注釋掉。
然后,寫一、兩句普通代碼,比如 定義一個區域Long變數,然后就寫一句隨便賦個值的。
如果可以在IDE下運行,可以寫一句: debug.print lCommand, dwDataType ,dwBufSize ,pUser
或者寫句 msgbox 陳述句,看能不能被執行到、會不會再造成錯誤。
從你提供的資訊來看,NET_DVR_SetDVRMessageCallBack_V30( )就是應該象我在 1F 說的那樣宣告和使用。
uj5u.com熱心網友回復:
不要做A語言代碼修改為B語言代碼的無用功。也不要做用A語言代碼直接呼叫B語言代碼庫這樣復雜、這樣容易出錯的傻事。
只需讓A、B語言代碼的輸入輸出重定向到文本檔案,或修改A、B語言代碼讓其通過文本檔案輸入輸出。
即可很方便地讓A、B兩種語言之間協調作業。
uj5u.com熱心網友回復:
又見 XXX點讀機…………
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/132444.html
標籤:API
上一篇:分享:最完美最簡潔的代碼;如果你安裝了聲卡的話,還能發出聲音。
下一篇:用電腦Ip地址加密軟體
