请教 Delphi / Windows SDK/APIhttp://www.delphi2007.net/DelphiNetwork/html/delphi_20061214144328129.html
Tag60190=record
CmdID:Word;
bOnline:boolean;
end;
我有一个这样的结构体,服务器返回给我一个这样的结构体.服务器的代码是C++,但服务器返回的时候,把bOnline付值为1或者零我用TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));接收服务器返回给我的结构体 .
当我接收完了之后,我怎么写条件判断语句呢?比如:if byte(TagRoleonlineback.bOnline)=1 then这样写不对啊
该怎么写这个判断语句
直接用就行了
if TagRoleonlineback.bOnline then
大哥,这样不行啊.我写了,不行啊,如果我要写个MESSAGEBOX弹出一个对话框,来看TagRoleonlineback.bOnline 这个值,该怎么写呢?
注意下 Boolean delphi 中相当于 Integer 的长度, 另外还有 WordBool(2byte), ByteBool
ShowMessage(BoolToStr(TagRoleonlineback.bOnline))
我也是这样写的呀,但对话框显示为空,是不是我服务器发过来的消息我没有接收到呢??TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));也就是说,这句没有接收服务器发过来的消息
对了,我这个boolean必须为一个字节
Tag60190=record
CmdID:Word;
bOnline:boolean;
end;
这个结构及其内部元素的字节长度,以及内部元素的排序顺序要与C语言的一致。
且要注意是否紧密排列的影响
目前结构是一致的,我不知道DELPHI里boolean是多少字节,C++那边传过来的是一个字节.我不玩DELPHI,但这个项目要用DELPHI,各位大哥帮帮忙啊
你这样声明结构试试
Tag60190=packed record
CmdID:Word;
bOnline:boolean;
end;
目前需求是这样的,我先向服务器发一条消息(验证身份),然后服务器会反馈一条消息给我,我根据服务器反馈给我的消息,如果验证通过,就再发一条消息给服务器.如此而已,请问我该怎么写???
var
stredit2:string;
stredit3:string;
stredit1:string;
begin
if TcpClient.Connected =true then
TcpClient.Disconnect;
try
begin
TcpClient.Host :=Edit5.Text; // 连接服务器的IP跟端口
Tcpclient.Port :=StrtoInt(Edit6.Text);
with TcpClient do
begin
try
Connect(3000);
except
TcpClient.Host :='';
tcpclient.Port :=0;
Application.MessageBox(pChar('踢人-->登陆失败!'),pChar('错误'),MB_OK+MB_ICONINFORMATION);
end;
end;
Application.MessageBox(pChar('连接远程主机成功'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);
TagCheck.CmdID :=60001;
TagCheck.wSize :=sizeof(TagCheck);
TagCheck.dwSerial :=1000000000;
TagCheck.szGmAccountName :='SuperGm';
TagCheck.szGmPassword :='kungfu';
TagRole.CmdID := 60175;
TagRole.wSize :=sizeof(TagRole);
TagRole.dwSerial :=1000000000;
stredit2 :=Edit2.Text;
stredit3 :=Edit3.Text;
stredit1:=Edit1.Text;
TagRole.dwBorough :=Crc(pchar(stredit2));
TagRole.dwWorldNameCrc :=Crc(pchar(stredit3));
FillChar(TagRole.szRoleName,SizeOf(TagRole.szRoleName),#0);
Assert(Length(stredit1)<=SizeOf(TagRole.szRoleName));
Move(PChar(stredit1)^,TagRole.szRoleName[0],Length(stredit1));
TagRoleonline.CmdID :=60185;
TagRoleonline.wSize :=sizeof(TagRole);
TagRoleonline.dwSerial :=1000000000;
TagRoleonline.dwBorough :=Crc(pchar(stredit2));
TagRoleonline.dwWorldNameCrc :=Crc(pchar(stredit3));
stredit1 :=Edit1.text;
FillChar(TagRoleonline.szRoleName,SizeOf(TagRoleonline.szRoleName),#0);
Assert(Length(stredit1)<=SizeOf(TagRoleonline.szRoleName));
Move(PChar(stredit1)^,TagRoleonline.szRoleName[0],Length(stredit1));
isize:=sizeof(TagCheck);
TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出验证用户名跟密码的指令
TcpClient.WriteBuffer(TagCheck,sizeof(TagCheck),true);//向服务器发出验证用户名跟密码的指令
sleep(3000);
TcpClient.ReadBuffer(TagCheckback,sizeof(TagCheckback));//接受服务器返回的指令,验证是否通过
Application.MessageBox(pchar(inttostr(TagCheckback.CmdID)),pChar('角色验证ID'),MB_OK);
if TagCheckback.dwErrorCode=0 then
begin
isize :=sizeof(TagRoleonline);
TcpClient.WriteBuffer(isize,sizeof(DWORD),true);//向服务器发出查询这个角色是否在线的指令
TcpClient.WriteBuffer(TagRoleonline,sizeof(TagRoleonline),true);//向服务器发出查询这个角色是否在线的指令
sleep(3000);
TcpClient.ReadBuffer(TagRoleonlineback,sizeof(TagRoleonlineback));//接受服务器返回的指令,角色是否在线
Application.MessageBox(pchar(inttostr(TagRoleonlineback.CmdID)),pChar('角色是否在线ID'),MB_OK);
if TagRoleonlineback.bOnline then
begin
Application.MessageBox(pchar('说明已经接收到服务器发给我的角色是否在线的消息'),pChar('角色是否在线'),MB_OK);
isize :=sizeof(TagRole);
TcpClient.WriteBuffer(isize,sizeof(DWORD),true); //向服务器发出踢角色下线的指令
TcpClient.WriteBuffer(TagRole,sizeof(TagRole),true); //向服务器发出踢角色下线的指令
sleep(3000);
TcpClient.ReadBuffer(TagRoleback,sizeof(TagRoleback));//接受服务器返回的指令,踢角色下线是否成功
if TagRoleback.dwErrorCode=0 then
Application.MessageBox(pChar('该角色已被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION)
else
Application.MessageBox(pChar('该角色没有被成功踢下线,请继续其它操作!'),pChar('踢人'),MB_OK+MB_ICONINFORMATION);
end;
end;
TcpClient.Disconnect;
end;
except on e:exception do
begin
Application.MessageBox(pChar(e.message),pChar('踢人'),MB_OK+MB_ICONINFORMATION);
TcpClient.Disconnect;
end;
end;
end;
大家帮忙看一下,看这段测试代码哪里不对,是不是要用线程,我如果开启线程的话,该怎么做呢??