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:
- 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
Que signifie "avoir des problèmes"? Je –
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