2010-03-15 225 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