Delphi下使用指针的简单总结(转)
来源:互联网 发布:mysql insert字段 编辑:程序博客网 时间:2024/05/17 05:13
在网上无意间看到一篇关于delphi下使用指针的贴子,感觉还不错,分享一下
第1种方法是我们最常使用的,第2种用的比较少,第3种我一直没有用过:(
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我定义的是一个全局函数。原因是这样取得函数的指针的时候比较简单
- Delphi下使用指针的简单总结
- Delphi下使用指针的简单总结
- Delphi下使用指针的简单总结
- Delphi下使用指针的简单总结(转)
- Delphi下指针使用总结
- Delphi 下 VCLZip控件的简单使用
- DELPHI指针使用的心得
- Delphi 环境下使用DirectDraw实现简单的全屏游戏
- Delphi指针简单入门
- delphi指针简单入门:
- delphi指针简单入门:
- delphi指针简单入门
- delphi指针简单入门
- 指针的指针使用总结
- delphi TREEVIEW的简单使用
- delphi TREEVIEW的简单使用
- 指针及二级指针的简单总结
- 智能指针的简单总结
- 为IE8制作Web Slices
- http 400错误的解决方法
- 怎样获得虚函数的指针
- C#实现消息的收发
- 求间隔半小时数据 的处理方法。
- Delphi下使用指针的简单总结(转)
- 初建测试团队应该注意的几个方面
- Microsoft Visual Studio 2008試用版注冊
- 不区分大小写
- 【收藏】ASP教程:数据库操作类
- 流媒体相关
- 网络带宽与下载速度的误解
- sun的没落是悲还是喜?
- ARM系统基本文件格式