要求:把下面的结构转换成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;
请各位高手指点,十万火急。
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;
请各位高手指点,十万火急。
解决方案 »
- 在线等.急
- 关于listbox的问题......
- 大家快去看,日本靖国神社网站被中国人黑了!
- 1stclass 4000 求助 在线等... ...
- 如何转string为pchar类型
- idHttp论坛发帖提示非法操作...
- 函数怎么返回一个动态数组??
- SQL Server 7英文版备份出来的数据库,能不能在SQL Server 2000中文版上恢复?
- 我这个时间比较的问题已经问过了,但我还是没有弄明白。请高手赐教
- 想样EDIT1控件输入的任合东东都显示*怎么实现?(就向密码输入框那样!)
- 如何把stringgrid 中的数据更新到access数据库?
- 猜猜哪位是阿三,哪位是华仔,猜对获取20分,散完分之止
type
m_messagecallback = procedure(hHandle: longint; wParam: integer; lParam: integer; context: Pointer); stdcall;
type
channel_clientinfo = record
....
m_messagecallback : procedure(hHandle: longint; wParam: integer; lParam: integer; context: Pointer); stdcall; end;
void (WINAPI *m_messagecallback)(LONG hHandle,int wParam,int lParam,void *context);
参数hHandle为接受消息的句柄,int wParam,int lParam为消息传的参数,context为用户指针,该指针传进去后你可以使用,如果不用设为0或者null,即可。
还有不清楚么
这是播放事件
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;
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;
BOOL VSNET_ClientStop(LONG hHandle)
说明:停止播放,断开服务器服务器的连接;
参数:hHandle是VSNET_ClientStart的返回值;
返回值:TRUE表示成功,FALSE表示失败。
pchaninfo.m_messagecallback := nil;试试看
回调函数这么改写:
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';