2010-03-15 9 views
1

J'ai de la difficulté à trouver une solution à mon problème. Je suis en train de convertir un client API funktion de C++ à VB.NET, et je pense avoir quelques problèmes avec la fonction de rappel.C++ à vb.net, problèmes avec la fonction de rappel

parties du code C++:

typedef struct {

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;

CPLAYER_API LONG __stdcall MP4_ClientStart (PCLIENT_VIDEOINFO pClientinfo, vide (callback * ReadDataCallBack) (DWORD nPort, UCHAR * pPacketBuffer, DWORD nPacketSize));

void 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; 
} 

Description du SDK:

  1. MP4_ClientStart

Cette fonction démarre une connexion. Le format de l'appel est:

LONG __stdcall MP4_ClientStart (PCLIENT_VIDEOINFO pClientinfo, void (* ReadDataCallBack) (DWORD nChannel, UCHAR * pPacketBuffer, DWORD nPacketSize))

Paramètres pClientinfo contient les informations. de cette connexion.

nChannel contient le canal de la carte.

pPacketBuffer maintient le pointeur sur le tampon de réception. NPacketSize est la longueur du tampon de réception.

Valeurs de retour Si la fonction réussit, la valeur de retour est le contexte de cette connexion. Si la fonction échoue, la valeur de retour est -1.

Remarques

typedef struct {

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 contient le canal auquel le client souhaite se connecter.

m_bSendMode contient le mode réseau de la connexion.

m_bImgFormat: Format d'image, 0 est le principal canal vidéo, 1 est sous le canal vidéo

m_sIPAddress contient l'adresse IP du serveur.

m_sUserName contient le nom de l'utilisateur.

m_sUserPassword contient le mot de passe de l'utilisateur. M_bUserCheck contient la valeur que le nom et le mot de passe de l'utilisateur soient envoyés ou non.

m_hShowVideo contient Handle pour cette fenêtre vidéo.

Si m_hShowVideo contient NULL, le client ne peut être enregistré que sans décodeur.

Si m_bUserCheck est FALSE, nous enverrons m_sUserName et m_sUserPassword comme NULL, sinon nous enverrons chaque 50 octets.

La longueur de m_sIPAddress et de m_sUserName doit être supérieure à 50 octets. ReadDataCallBack: Lorsque la bibliothèque reçoit un paquet d'un serveur, ce rappel est appelé.


Mon code VB.Net:

importations System.Runtime.InteropServices

Classe publique 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 

ici End Class


est d'autres exemples du code:

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

Delphi

: //read.pudn.com/downloads91/sourcecode/multimedia/streaming/349759/Delphi_client/Unit1.pas__.htm

+0

Que signifie "avoir des problèmes"? Je –

+0

obtenir une erreur sur: MP4_ClientStart (CLIENTINFO, MyDEL) .................... Informations complémentaires: Tentative de lecture ou d'écriture mémoire protégée . C'est souvent une indication que l'autre mémoire est corrompue. Le thread 0x1f9c s'est terminé avec le code 0 (0x0). Le programme '[6796] temp.vshost.exe: Managed' s'est terminé avec le code -1073741819 (0xc0000005). – johan

Répondre

0

Ce n'est pas une solution complète votre problème, mais je commencerais par ajouter StructLayoutAttribute (Sequential) à votre structure.

Imports System.Runtime.InteropServices 

<StructLayout(LayoutKind.Sequential)> _ 
Public Structure CLIENT_VIDEOINFO 
+0

'LayoutKind.Sequential' devrait certainement être ajouté, mais il ne peut pas être la cause de l'erreur puisque c'est effectivement ce que .NET utilise par défaut (depuis au moins .NET 2.0 AFAIK). –

+0

Point intéressant. Je suis sûr que j'ai eu le code qui a échoué jusqu'à ce que je mette dans un LayoutKind.Sequential explicite, cependant j'ai confirmé que Sequential est la valeur par défaut même dans 1.1. Notez que la référence VB pour la structure http://msdn.microsoft.com/en-us/library/k69kzbs1.aspx implique dans Remarques> Comportement> Consommation de mémoire que vous devez spécifier StructLayout pour confirmer la disposition de la mémoire, mais la documentation pour StructLayoutAttribute http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.structlayoutattribute.aspx états Sequential est la valeur par défaut pour les structures dans les compilateurs Microsoft. –