我很難在這裏試圖找到我的問題的解決方案。C++到vb.net,回調函數的問題
我想將客戶端API功能從C++轉換爲VB.NET, ,我認爲回調函數有一些問題。 C++代碼的
部分:
typedef結構{
BYTE m_bRemoteChannel;
BYTE m_bSendMode;
BYTE m_nImgFormat; // =0 cif ; = 1 qcif
char *m_sIPAddress;
char *m_sUserName;
char *m_sUserPassword;
BOOL m_bUserCheck;
HWND m_hShowVideo;
} CLIENT_VIDEOINFO,* PCLIENT_VIDEOINFO; (PCLIENT_VIDEOINFO pClientinfo,void(CALLBACK * ReadDataCallBack)(DWORD nPort,UCHAR * pPacketBuffer,DWORD nPacketSize));}};
空隙CALLBACK ReadDataCallBack(DWORD NPORT,UCHAR * pPacketBuffer,DWORD nPacketSize)
{ TRACE( 「%d \ n」 個,nPacketSize); }
.....
aa5.m_sUserName = "123";
aa5.m_sUserPassword="w";
aa5.m_bUserCheck = TRUE;
MP4_ClientSetTTL(64);
nn1 = MP4_ClientStart(&aa5,ReadDataCallBack);
if (nn1 == -1)
{
MessageBox("error");
return;
}
SDK描述:
- MP4_ClientStart
該函數啓動的連接。調用的格式爲:
LONG __stdcall MP4_ClientStart(PCLIENT_VIDEOINFO pClientinfo, 無效(* ReadDataCallBack)(DWORD N溝道,UCHAR * pPacketBuffer,DWORD nPacketSize))
參數 pClientinfo保存的信息。這個連接。
nChannel擁有卡的頻道。
pPacketBuffer保持指針到接收緩衝區。
nPacketSize保持接收緩衝器的長度。
返回值 如果函數成功返回值是這方面的內容。 如果函數失敗,則返回值爲-1。
備註
typedef結構{
BYTE m_bRemoteChannel;
BYTE m_bSendMode;
BYTE m_bImgFormat;
char * m_sIPAddress;
char * m_sUserName;
char * m_sUserPassword;
BOOL m_bUserCheck;
HWND m_hShowVideo;
} CLIENT_VIDEOINFO,* PCLIENT_VIDEOINFO;
m_bRemoteChannel保存客戶端想要連接的通道。
m_bSendMode保存連接的網絡模式。
m_bImgFormat:圖像格式,0是主頻道視頻,1是子通道視頻
m_sIPAddress保存服務器的IP地址。
m_sUserName保存用戶名。
m_sUserPassword保存用戶密碼。
m_bUserCheck保存是否發送用戶名和密碼的值。
m_hShowVideo包含此視頻窗口的句柄。
如果m_hShowVideo包含NULL,則客戶端可以僅在沒有解碼器的情況下進行記錄。
如果m_bUserCheck爲FALSE,我們將發送m_sUserName和m_sUserPassword作爲NULL,否則我們會發送每個50個字節。
m_sIPAddress和m_sUserName的長度必須大於50個字節。
ReadDataCallBack:當庫從服務器接收到數據包時,調用此回調函數。
我VB.Net代碼:
進口System.Runtime。InteropServices
公共類Form1中
Const WM_USER = &H400
Public Structure CLIENT_VIDEOINFO
Public m_bRemoteChannel As Byte
Public m_bSendMode As Byte
Public m_bImgFormat As Byte
Public m_sIPAddress As String
Public m_sUserName As String
Public m_sUserPassword As String
Public m_bUserCheck As Boolean
Public m_hShowVideo As Long 'hWnd
End Structure
Public Declare Function MP4_ClientSetNetPort Lib "hikclient.dll" (ByVal dServerPort As Integer, ByVal dClientPort As Integer) As Boolean
Public Declare Function MP4_ClientStartup Lib "hikclient.dll" (ByVal nMessage As UInteger, ByVal hWnd As System.IntPtr) As Boolean
<DllImport("hikclient.dll")> Public Shared Function MP4_ClientStart(ByVal Clientinfo As CLIENT_VIDEOINFO, ByRef ReadDataCallBack As CALLBACKdel) As Long
End Function
Public Delegate Sub CALLBACKdel(ByVal nPort As Long, <MarshalAs(UnmanagedType.LPArray)> ByRef pPacketBuffer As Byte(), ByVal nPacketSize As Long)
Public Sub CALLBACK(ByVal nPort As Long, <MarshalAs(UnmanagedType.LPArray)> ByRef pPacketBuffer As Byte(), ByVal nPacketSize As Long)
End Sub
Public mydel As New CALLBACKdel(AddressOf CALLBACK)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim Clientinfo As New CLIENT_VIDEOINFO()
Clientinfo.m_bRemoteChannel = 0
Clientinfo.m_bSendMode = 0
Clientinfo.m_bImgFormat = 0
Clientinfo.m_sIPAddress = "193.168.1.100"
Clientinfo.m_sUserName = "1"
Clientinfo.m_sUserPassword = "a"
Clientinfo.m_bUserCheck = False
Clientinfo.m_hShowVideo = Me.Handle 'Nothing
MP4_ClientSetNetPort(850, 850)
MP4_ClientStartup(WM_USER + 1, Me.Handle)
MP4_ClientStart(Clientinfo, mydel)
End Sub
末級
這裏是代碼的一些其他的例子:
C#
http://blog.csdn.net/nenith1981/archive/2007/09/17/1787692.aspx
VB
://read.pudn.com/downloads70/sourcecode/graph/250633/MD%E5%AE%A2%E6%88%B7%E7%AB%AF%28VB%29/hikclient。 bas __。htm
://read.pudn.com/downloads70/sourcecode/graph/250633/MD%E5%AE%A2%E6%88%B7%E7%AB%AF%28VB%29/Form1。 。FRM __ HTM
德爾福
://read.pudn.com/downloads91/sourcecode/multimedia/streaming/349759/Delphi_client/Unit1.pas__.htm
「有一些問題」是什麼意思? – 2010-03-15 22:05:34
我得到一個錯誤的: MP4_ClientStart(ClientInfo客戶端,mydel).................... 其他信息:試圖讀取或寫入保護內存。這通常表明其他內存已損壞。 線程0x1f9c已退出,代碼爲0(0x0)。 程序'[6796] temp.vshost.exe:Managed'已退出,代碼爲-1073741819(0xc0000005)。 – johan 2010-03-16 05:15:48