• [转]Delphi 指针


    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我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单

  • 相关阅读:
    Android Studio 编译报错 AAPT2 error: check logsfor details
    pytest01--生成测试报告及allure的介绍
    三号坑——自动化测试用例前置conftest.py文件
    【pycharm】如何设置以pytest方式去运行用例!!!
    二号坑 —— 导出、安装依赖包
    一号坑 —— 数据比对时碰到的问题
    十六——reflect反射机制
    十五—— 装饰器
    十三 —— 文件读写
    十二 —— python的内置函数
  • 原文地址:https://www.cnblogs.com/minghang/p/5616903.html
Copyright © 2020-2023  润新知