var
发送
boolean
转换
poiexp
接收网络传输重要性
由于最近公司太忙,好久没有更新我的 BLOG 了.原来想着写写关于 HOOK 驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢.开发游戏也有一段时间了,发现使用 DELPHI 来开发网络游戏不了解 DELPHI 下指针的使用是完全不行的.所以今天我简单总结以下我使用 DELPHI 指针的心得.希望对大家有所帮助.
记得在大学学习 C 语言的时候在谭浩强编写的书中,关于指针一章的开始就说 "指针是 C 语言的精华",可见指针对于 C 语言的重要性.其实在 Pascal 语言中指针也占据着重要的位置.
1:指针的赋值.
上面的代码中使用了 Test2:=Test1; 进行指针的赋值,也就是说进行赋值以后两个变量指向的相同的地址,所以当 Test1 的 Age 发送变化以后 Test2 的 Age 也随之发生了变化.反过来也是一样.那如果我们要将 Test1 中的内容放在 Test2 中并且当 Test1 中的内容发生变化的时候 Test2 的内容不会发生变化有如何来做呢?其实很简单,使用 Test2^:=Test1^;就可以了,这个时候变量 Test1 和变量 Test2 指向的是两个不同的地址,当一方的内容发生变化的时候另外一方不会受到影响.
type
RTestInfo = record
Age:Integer;
end;
PtestInfo = ^ RtestInfo;
var
Test1,Test2:PtestInfo;
Begin
New(Test1);
New(Test2);
Test1^.Age:=12;
Test2:=Test1;
Application.MessageBox(Pchar(IntToStr(Test2^.Age)),'测试',MB_OK);
Test1^.Age:=13;
Application.MessageBox(Pchar(IntToStr(Test2^.Age)),'测试',MB_OK);
DisPose(Test1);
DisPose(Test2);
End;
2:数组和指针的转换.
曾使用过 API 函数来编写网络通信的都知道,网络传输过程中传输的都是 char 类型的数组.而我们经常需要将自己定义的一个结构通过网络传输出去,并且当对方接收到这个数据以后又能将其转换为相应的结构来处理.以前我是使用添加标记位来解决这个问题.其实使用数组和指针转换是很简单的.
在上面的例子中首先我们将我们定义数组 Data 清空,然后使用函数 StrMove 将结构 Test 的内容复制到 Data 中去.这个时候就可以将数据发送出去.当对方接受到数据以后,可以用以下的代码进行还原.
type
RtestInfo = record
Age:Integer;
End;
Var
Test: RtestInfo;
Data:array[0..1024] of Char;
Begin
Test.Age:=13;
Fillchar(Data,SizeOf(Data),#0);
StrMove(Data,@ Test,sizeof(Test));
// 数据发送
End;
这个时候就可以对发送过来的数据进行相应的处理了.
type
RtestInfo = record
Age:Integer;
End;
Var
Test: RtestInfo;
Begin
StrMove(@Test,Data,sizeof(Test));
// 处理数据
End;
3:函数指针的使用.
在分模块开发的过程中,DLL 占据着重要的位置.在我开发游戏的服务端也是使用 DLL 的方式.在开发的时候遇见这样的一个问题,例如我在一个 EXE 中编写了一个功能非常复杂的函数,在 DLL 中我想使用到它,如何做呢?其实使用函数的指针就可以很方便的实现.
我们知道 DLL 的运行空间是和调用它的 EXE 在一起的.也就是说在这个空间中的资源理论上 DLL 是都可以使用.所以只要将 exe 中的函数指针传给 DLL,那么 DLL 就可以使用这个函数了.
例如在 DLL 中有函数 ModuleSendData 作用是让 EXE 中传入函数的指针链表,这个链表中的函数都是 DLL 中可能用到的.
在 EXE 中的代码是:
SendDataFun: procedure(Casetype: Byte; UserSocket: RUserSocket; Data: array of char; DataLen: Integer);
function ModuleSendData(FunPList: TList): Boolean; stdcall; export;
begin
SendDataFun := FunPList.Items[0];
end;
其中 DllSendData 就是我们想传入给 DLL 的函数.
Linstance:=LoadLibrary(Pchar(Temp));
if Linstance>0 then
begin
// 将发送数据的指针传入 DLL 插件中
@GiveModuleFun:=GetProcAddress(Linstance,'ModuleSendData');
if @GiveModuleFun<>NIl then
begin
m_FunList:=TList.Create;
// 发送数据
t_Pointer:=@DllSendData;
m_FunList.Add(t_Pointer);
GiveModuleFun(m_FunList);
End;
End;
这个时候在 DLL 中使用 SendDataFun 就和一般的函数一样了.
这里注意的一点是 Exe 中的函数 DllSendData 我定义的是一个全局函数.原因是这样取得函数的指针的时候比较简单(关于类里面的函数指针如何取得我不了解,希望有了解的朋友不吝赐教,感激不尽).
Delphi 下使用指针的简单总结
来源: http://www.bubuko.com/infodetail-2452716.html