Delphi下指针使用总结

来源:互联网 发布:刷卡提示网络异常 编辑:程序博客网 时间:2024/04/29 22:04

======================================================
注:本文源代码点此下载
======================================================

由于最近公司太忙,好久没有更新我的blog了。原来想着写写关于hook驱动的文章,可是最后想想好久已经没有做驱动的东西了,怕写出来有错误,于是作罢。开发游戏也有一段时间了,发现使用delphi来开发网络游戏不了解delphi下指针的使用是完全不行的。所以今天我简单总结以下我使用delphi指针的心得。希望对大家有所帮助。 记得在大学学习c语言的时候在谭浩强编写的书中,关于指针一章的开始就说"指针是c语言的精华",可见指针对于c语言的重要性。其实在pascal语言中指针也占据着重要的位置。 1:指针的赋值。 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; 上面的代码中使用了test2:=test1;进行指针的赋值,也就是说进行赋值以后两个变量指向的相同的地址,所以当test1的age发送变化以后test2的age也随之发生了变化。反过来也是一样。那如果我们要将test1中的内容放在test2中并且当test1中的内容发生变化的时候test2的内容不会发生变化有如何来做呢?其实很简单,使用test2^:=test1^;就可以了,这个时候变量test1和变量test2指向的是两个不同的地址,当一方的内容发生变化的时候另外一方不会受到影响。 2:数组和指针的转换。 曾使用过api函数来编写网络通信的都知道,网络传输过程中传输的都是char类型的数组。而我们经常需要将自己定义的一个结构通过网络传输出去,并且当对方接收到这个数据以后又能将其转换为相应的结构来处理。以前我是使用添加标记位来解决这个问题。其实使用数组和指针转换是很简单的。 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; 在上面的例子中首先我们将我们定义数组data清空,然后使用函数strmove将结构test的内容复制到data中去。这个时候就可以将数据发送出去。当对方接受到数据以后,可以用以下的代码进行还原。 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中可能用到的。 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; 在exe中的代码是: linstance:=loadlibrary(pchar(temp)); if linstance>0 then begin //将发送数据的指针传入dll插件中 @givemodulefun:=getprocaddress(linstance,'modulesenddata'); if @givemodulefun关注我收藏该文与我联系


======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/
原创粉丝点击