2010-03-15 132 views
1

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

    +0

    “有一些问题”是什么意思? – 2010-03-15 22:05:34

    +0

    我得到一个错误的: MP4_ClientStart(ClientInfo客户端,mydel).................... 其他信息:试图读取或写入保护内存。这通常表明其他内存已损坏。 线程0x1f9c已退出,代码为0(0x0)。 程序'[6796] temp.vshost.exe:Managed'已退出,代码为-1073741819(0xc0000005)。 – johan 2010-03-16 05:15:48

    回答

    0

    这并不是一个完整的解决方案你的问题,但我会开始添加StructLayoutAttribute(顺序)到你的结构。

    Imports System.Runtime.InteropServices 
    
    <StructLayout(LayoutKind.Sequential)> _ 
    Public Structure CLIENT_VIDEOINFO 
    
    +0

    'LayoutKind.Sequential'肯定应该添加,但它不能成为错误的原因,因为这实际上是.NET默认使用的(至少.NET 2.0 AFAIK)。 – 2010-03-16 08:57:39

    +0

    有趣的一点。我相信我有代码失败,直到我把一个显式的LayoutKind.Sequential,但我已经证实Sequential是默认的,即使在1.1。 注意结构的VB参考 http://msdn.microsoft.com/en-us/library/k69kzbs1.aspx 意味着在备注>行为>内存消耗,您需要指定StructLayout来确认内存布局,但StructLayoutAttribute的文档 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx states Sequential是Microsoft编译器中结构的默认值。 – 2010-03-17 04:39:39