由于最近公司太忙,好久没有更新我的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<>NIl then
        begin
          m_FunList:=TList.Create;
            //发送数据
            t_Pointer:=@DllSendData;
            m_FunList.Add(t_Pointer);
                  GiveModuleFun(m_FunList);
                   End;
         End;
其中DllSendData就是我们想传入给DLL的函数。
 
这个时候在DLL中使用SendDataFun就和一般的函数一样了。
这里注意的一点是Exe中的函数DllSendData我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单(关于类里面的函数指针如何取得我不了解,希望有了解的朋友不吝赐教,感激不尽)。
https://www.cnblogs.com/chenmfly/p/4858926.html

Delphi下使用指针的简单总结(指针的赋值,数组和指针的转换,函数指针的使用)的更多相关文章

  1. Delphi 函数指针(函数可以当参数)

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  2. Delphi 函数指针(三大好处:灵活,委托的本质,回调机制),还可把函数指针当参数传入

    首先学习: 指向非对象(一般的)函数/过程的函数指针 Pascal 中的过程类型与C语言中的函数指针相似,为了统一说法,以下称函数指针.函数指针的声明只需要参数列表:如果是函数,再加个返回值.例如声明 ...

  3. C函数指针简单用例

    (1)函数指针:可以指向 一类 固定形参类型和返回值类型 的函数 的指针声明:int fun(int, int)    ||    \/int (*pfun)(int, int) pfun就是函数指针 ...

  4. 成员函数指针与高性能C++委托

    1 引子 标准C++中没有真正的面向对象的函数指针.这一点对C++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值. ...

  5. [转]成员函数指针与高性能的C++委托

    原文(作者:Don Clugston):Member Function Pointers and the Fastest Possible C++ Delegates 译文(作者:周翔): 成员函数指 ...

  6. C语言函数指针实验

    上次看Atmel的示例工程,发现人家使用了函数指针的结构体(函数指针结构体).感叹人家的C语言功夫审核,自己费劲还是只能读懂的份.不过,函数指针确实好用.今天就试试这个超牛的东西.Now let's ...

  7. 虚函数指针sizeof不为sizeof(void*)

    ref:http://bbs.csdn.net/topics/360249561 一个继承了两个虚基类又增加了自己的一个虚函数pif的类,sizeof(指向pif的指针)竟然是8(X86).我是从这里 ...

  8. 转:函数指针数组的妙用(I)

    转自:http://blog.sina.com.cn/s/blog_4c78b35f010008hi.html 笔者在开发某软件过程中遇到这样一个问题,前级模块传给我二进制数据,输入参数为 char* ...

  9. C语言指针系列 - 一级指针.一维数组,二级指针,二维数组,指针数组,数组指针,函数指针,指针函数

    1. 数组名 C语言中的数组名是一个特殊的存在, 从本质上来讲, 数组名是一个地址, 我们可以打印一个指针的值,和打印一个数组的值来观察出这个本质: int nArray[10] ={ 0 }; in ...

  10. C/C++函数指针详解(转)

    这两天在研究C/C++的函数指针,找到一篇讲解比较详细的博客,内容有点多,但是讲解得比较详细,适合初学者.特转之: 1.     无处不见的函数指针 使用函数指针可以设计出更优雅的程序,比如设计一个集 ...

随机推荐

  1. 一键部署MongoDB集群Windows版

    由于周末在家手头没有虚拟机,所以在windows下单机完毕部署要求,并编写bat执行脚本. 1.创建配置文件及相关文件夹 总的启动脚本例如以下(startmc.bat): rem m1 start m ...

  2. erlang工具:Sublime Text的插件

    SublimErl  :https://github.com/ostinelli/SublimErl   (推荐,操作较简单)                                      ...

  3. perl readlink 函数-返回软链接指向的文件

    readlink 函数专门用于处理链接,可以返回该链接指向的文件的路径 代码示例: print readlink($prog) if (-f $prog && -l $prog):

  4. Spring-MVC案例:Spitter的笔记

    源码地址:https://github.com/Young4Dream/yan/tree/master/Maven_spittr 笔记: 1.当DispatcherServlet启动时,会创建Spri ...

  5. hbase集群部分节点HRegionServer启动后自动关闭的问题

    参考链接 http://f.dataguru.cn/thread-209058-1-1.html 我有4HRegionServer节点,1个master,其中3个是unbuntu 系统,2个节点是ce ...

  6. SharePoint 2013 workflow cannot start automatically when you logged in site as a system account

    I have created one simple workflow on custom list using SharePoint designer 2013.While designing wor ...

  7. jQuery实现鼠标选中文字后弹出提示窗口效果

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. mysql数据库中查看某个视图的定义的SQL语句

    环境描述: mysql版本:5.5.57-log 操作系统版本:Red Hat Enterprise Linux Server release 6.6 (Santiago) 需求描述: 查看某个视图的 ...

  9. linux下安装pip以及导入第三方包

    python有着强大的第三方库,数量很多且功能强大. 最原始的办法是在官网上下载压缩包,解压,然后运行setup.py来进行安装. 显然这种方法很繁琐,不方便.因此有了包管理工具. pip是一个包管理 ...

  10. Oracle-未能加载文件或程序集“oracle.dataaccess”或它的某一个依赖项。试图加载格式不正确的程序。

    未能加载文件或程序集“oracle.dataaccess”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以 ...