要求:把下面的结构转换成DELPHI的,现在只有回调函数不知怎么转换
VC版的:
CHANNEL_CLIENTINFO结构:
typedef struct{
char *m_sername;
char *m_username;
char *m_password;
WORD m_tranType;
WORD m_playstart;
BYTE m_ch;
HWND m_hVideohWnd;
HWND m_hChMsgWnd;
UINT m_nChmsgid;
int m_buffnum;
int m_useoverlay;
COLORREF nColorKey;
void (WINAPI *m_messagecallback)(LONG hHandle,int wParam,int lParam,void *context);
void *context;
}CHANNEL_CLIENTINFO;
说明:
m_sername:服务器名称,如果是通过转发服务器连接时需要该名称检索服务器;
m_username:用户名,长度不超过20个字符;
m_password:密码,长度不超过20个字符;
m_tranType:连接模式,1:UDP方式,2:多播方式,3:TCP方式;
m_playstart:启动实时预览,TRUE:成功连接服务器后开始实时预览图像,FALSE:连接服务器后不预览图像,可以调用VSNET_ClientStartView手动启动实时预览;
m_ch:连接服务器的通道;
m_hVideohWnd:播放窗口句柄;
m_hChMsgWnd: 通道消息通知窗口句柄,可以为NULL,用VSNET_ClientStartup注册的窗口接收消息
m_nChmsgid:  通道消息号;
m_buffnum:   播放用的缓冲大小,范围10-50,值越小可能会有丢失包的问题,越大效果越好,但会占用更过的内存;
m_useoverlay:OVERLAY使用标志,TRUE:表示创建OVERLAY的表面,如果OVERLAY表面创建失败,会自动使用其它的表面;
nColorKey:保留;
m_messagecallback:消息回调函数
context:用户上下文
现已DELPHI部分参数:
type
  channel_clientinfo = record
     m_sername:string; //服务器名称
     m_username:string; //登陆用户名
     m_password:string; //登陆密码
     m_tranType:word;  //连接模式(=1:UDP,=2:多播,=3:TCP)这里采用3=TCP
     m_playstart:word; //启动实时预览
     m_ch:byte;        //视频服务器通道号
     m_hVideohWnd:HWND; //播放窗口句柄
     m_hChMsgWnd:HWND;  //通道消息通知句柄
     m_nChmsgid:uint;   //通道消息号
     m_buffnum:integer; //播放用的缓冲大小
     m_useoverlay:integer; // Overlay使用标志
     nColorKey:Colorref;   //
     //void (WINAPI *m_messagecallback)(LONG hHandle,int wParam,int lParam,void *context);
                                    //VC消息回调函数怎么转换成delphi的
     context:string;
  end;
请各位高手指点,十万火急。

解决方案 »

  1.   


    type
      m_messagecallback = procedure(hHandle: longint; wParam: integer; lParam: integer; context:   Pointer); stdcall;  
      

  2.   


    type
      channel_clientinfo = record
        ....
        m_messagecallback : procedure(hHandle: longint; wParam: integer; lParam: integer; context:   Pointer); stdcall;  end; 
     
      

  3.   

    又是海康的sdk
    void (WINAPI *m_messagecallback)(LONG hHandle,int wParam,int lParam,void *context); 
    参数hHandle为接受消息的句柄,int wParam,int lParam为消息传的参数,context为用户指针,该指针传进去后你可以使用,如果不用设为0或者null,即可。
    还有不清楚么
      

  4.   

    回调函数啊  
    这是播放事件
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      button2.Enabled:=true;
      //VSNET_ClientStartup(wm_videomsg,form1.Handle);//启动朗驰客户端SDK;
      VSNET_ClientStartup(wm_videomsg,form1.Handle);//启动朗驰客户端SDK;
      pchaninfo.m_username:=Edit1.Text;
      pchaninfo.m_password:=Edit2.Text;
      pchaninfo.m_sername:=Edit3.Text;
      pchaninfo.m_tranType:=3; //TCP传送方式
      pchaninfo.m_playstart:=1; //=1 网络联上服务器自动监视视频 ,=0 需手动打开视频
      pchaninfo.m_ch:=strtoint(Edit5.Text);    //通道号
      pchaninfo.m_hVideohWnd:=panel1.Handle;
      pchaninfo.m_hChMsgWnd:=form1.Handle;
      pchaninfo.m_buffnum:=50;
      pchaninfo.m_useoverlay:=0;
      pchaninfo.nColorKey:=clblack;
      pchaninfo.m_messagecallback(panel1.handle,1,1,0);这里的参数调用不正确(不清楚参数要写些什么),导致停止事件不起作用
         厂家说明:消息回调函数返回失败时,不能在回调函数调用VSNET_ClientStop,可以同时使用消息和回调函数
      videownd:=VSNET_ClientStart(Edit3.Text,@pchaninfo,strtoint(Edit4.Text));  button1.Enabled:=false;
    end;停止事件
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      VSNET_ClientStop(videownd);
      button1.Enabled:=true;
    end;
      

  5.   

    type
      m_messagecallback = procedure(hHandle: longint; wParam: integer; lParam: integer; context:   Pointer); stdcall;
    procedure messagecallback(hHandle: longint; wParam: integer; lParam: integer; context:   Pointer); stdcall;
    beginend;pchaninfo.m_messagecallback := @messagecallback;
    编译通不过的话改成
    pchaninfo.m_messagecallback := messagecallback;
      

  6.   

    两个编译都不成问题,可是还是不能停止视频,我想还是那回调函数的问题消息回调函数返回失败时,不能在回调函数调用VSNET_ClientStop,可以同时使用消息和回调函数。结束操作函数
    BOOL VSNET_ClientStop(LONG hHandle)
    说明:停止播放,断开服务器服务器的连接;
    参数:hHandle是VSNET_ClientStart的返回值;
    返回值:TRUE表示成功,FALSE表示失败。
      

  7.   


    pchaninfo.m_messagecallback := nil;试试看
      

  8.   


    回调函数这么改写:
    void (WINAPI *m_messagecallback)(LONG hHandle,int wParam,int lParam,void *context); type   TMessageCallback = procedure(hHandle: HWND; w: WPARAM; l: LPARAM; context: Pointer); stdcall;   function VSNET_ClientStartup(m_nMessage: UINT; m_hWnd: HWND; ACallback: TMessageCallback = nil; pContext: Pointer = nil): boolean; stdcall; external 'NetHostSDK.dll';