zoukankan      html  css  js  c++  java
  • Delphi下使用指针的简单总结

    由于最近公司太忙,好久没有更新我的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我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单(关于类里面的函数指针如何取得我不了解,希望有了解的朋友不吝赐教,感激不尽)。
     
  • 相关阅读:
    【leetcode】1630. Arithmetic Subarrays
    【leetcode】1629. Slowest Key
    【leetcode】1624. Largest Substring Between Two Equal Characters
    【leetcode】1620. Coordinate With Maximum Network Quality
    【leetcode】1619. Mean of Array After Removing Some Elements
    【leetcode】1609. Even Odd Tree
    【leetcode】1608. Special Array With X Elements Greater Than or Equal X
    【leetcode】1603. Design Parking System
    【leetcode】1598. Crawler Log Folder
    Java基础加强总结(三)——代理(Proxy)Java实现Ip代理池
  • 原文地址:https://www.cnblogs.com/chenmfly/p/4858926.html
Copyright © 2011-2022 走看看