我很难在这里试图找到我的问题的解决方案。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