c ++ к vb.net, проблемы с функцией обратного вызова - PullRequest
1 голос
/ 16 марта 2010

Мне трудно найти решение моей проблемы.

Я пытаюсь преобразовать функцию клиентского API из C ++ в VB.NET, и я думаю, что есть некоторые проблемы с функцией обратного вызова.

части кода 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, void (CALLBACK * ReadDataCallBack) (DWORD nPort, UCHAR * pPacketBuffer, DWORD nPacketSize))

void CALLBACK ReadDataCallBack (DWORD nPort, UCHAR * pPacketBuffer, DWORD nPacketSize)

{ TRACE ( "% d \ п", 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 описание:

  1. MP4_ClientStart

Эта функция запускает соединение. Формат звонка:

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

Параметры pClientinfo содержит информацию. этой связи.

nChannel содержит канал карты.

pPacketBuffer содержит указатель на буфер приема.

nPacketSize содержит длину буфера приема.

Возвращаемые значения Если функция завершается успешно, возвращаемое значение является контекстом этого соединения. Если функция завершается ошибкой, возвращаемое значение равно -1.

Примечания

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 содержит канал, к которому клиент хочет подключиться.

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

Delphi

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

1 Ответ

0 голосов
/ 16 марта 2010

Это не полное решение вашей проблемы, но я бы начал с добавления StructLayoutAttribute (Sequential) к вашей структуре.

Imports System.Runtime.InteropServices

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