文档章节

Delphi 的内存操作函数(6): 跨进程的内存分配

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 591
阅读 10
收藏 0
点赞 0
评论 0

Delphi 为我们提供了三个方便的函数:
GlobalAllocPtr   {简化自 API 的 GlobalAlloc}
GlobalReAllocPtr {简化自 API 的 GlobalReAlloc}
GlobalFreePtr    {简化自 API 的 GlobalFree}

读写本程序以外的数据时可以使用它们, 很方便, 譬如:
p := GlobalAllocPtr(0, Len);      {分配}
p := GlobalReAllocPtr(p, Len, 0); {重分配}
GlobalFreePtr(p);                 {释放}

注意 GlobalAllocPtr 的第一个参数和 GlobalReAllocPtr 的最后一个参数, 上面给的都是 0;
这两个参数的意义是一样的, 规范一点应该写成 GMEM_FIXED (表示分配固定内存), 常用的参数还有:
GMEM_MOVEABLE {分配可移动内存}
GMEM_ZEROINIT {同时清空内存}
GHND          {分配可移动内存同时清空}
GPTR          {分配固定内存同时清空}

参数还有很多, 和相应的 API 函数的参数是一致的.

下面的例子并没有使用进程以外的对象, 可以把 Memo1.Handle 换做外部的其他文本容器(譬如记事本)试一试:

代码文件:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  p: Pointer;
  Len: Integer;
begin
  Len := 6+1;                    {假如想要读出 6 个字符, 要留出结束的空字符}
  p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}
  SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));
  ShowMessage(PChar(p)); {CodeGe}
  GlobalFreePtr(p);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  p: Pointer;
  Len: Integer;
begin
  Len := 6+1;                    {假如想要读出 6 个字符, 要流出结束的空字符}
  p := GlobalAllocPtr(0, Len*2); {分配内存 Len*2 是针对双字节字符}
  SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));
  ShowMessage(PChar(p)); {CodeGe}

  {在上一例的基础上继续, 先获取实际长度}
  Len := SendMessage(Memo1.Handle, WM_GETTEXTLENGTH, 0, 0);
  Len := (Len + 1) * 2;
  p := GlobalReAllocPtr(p, Len, GHND); {重新分配内存}
  SendMessage(Memo1.Handle, WM_GETTEXT, Len, Cardinal(p));
  ShowMessage(PChar(p)); {CodeGear Delphi 2009}

  GlobalFreePtr(p);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Memo1.Align := alLeft;
  Memo1.ScrollBars := ssVertical;
  Memo1.Text := 'CodeGear Delphi 2009';
end;

end.

 
 
 
 
 

 

 

  
窗体文件:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 151
  ClientWidth = 295
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnCreate = FormCreate
  PixelsPerInch = 96
  TextHeight = 13
  object Memo1: TMemo
    Left = 8
    Top = 8
    Width = 169
    Height = 89
    Lines.Strings = (
      'Memo1')
    TabOrder = 0
  end
  object Button1: TButton
    Left = 192
    Top = 32
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object Button2: TButton
    Left = 192
    Top = 72
    Width = 75
    Height = 25
    Caption = 'Button2'
    TabOrder = 2
    OnClick = Button2Click
  end
end

 
 
 
 
 

 

 

  

本文转载自:http://www.cnblogs.com/del/archive/2008/11/15/1334237.html

共有 人打赏支持
涂孟超
粉丝 12
博文 2004
码字总数 14107
作品 0
深圳
程序员
Android窗口管理分析(4):Android View绘制内存的分配、传递、使用

前文Android匿名共享内存(Ashmem)原理分析了匿名共享内存,它最主要的作用就是View视图绘制,Android视图是按照一帧一帧显示到屏幕的,而每一帧都会占用一定的存储空间,通过Ashmem机制APP...

看书的小蜗牛 ⋅ 2017/10/20 ⋅ 0

用好Delphi中的字符串

用好Delphi中的字符串日期:2005年10月18日 作者: 人气:17184 查看:[大字体 中字体 小字体]一:各种字符串  字符串是Object Pascal所有数据类型中最有用的类型。许多函数以字符串为传递参...

vga ⋅ 2016/08/09 ⋅ 0

delphi之多线程编程(一)

delphi之多线程编程(一) 本文的内容取自网络,并重新加以整理,在此留存仅仅是方便自己学习和查阅。所有代码均亲自测试 delphi7下测试有效。图片均为自己制作。 多线程应该是编程工作者的基础...

KavenSu ⋅ 2014/01/22 ⋅ 0

delphi 中几种多线程操作方式

在了解多线程之前我们先了解一下进程和线程的关系 一个程序至少有一个主进程,一个进程至少有一个线程。 为了保证线程的安全性请大家看看下面介绍 Delphi多线程同步的一些处理方案大家可以参考...

moodlxs ⋅ 2015/01/09 ⋅ 0

QShareMemory 学习

转自:http://hi.baidu.com/cyclone/blog/item/3ebca9ec06b81a2863d09f7a.html 目的:配合windows核心编程第17章(内存映射文件)的学习,顺便学习 QSharedMemery 在 Windows 下的实现部分 使用...

长平狐 ⋅ 2013/01/11 ⋅ 0

使用 malloc后free出错 错误所在

偶认为:这个问题是指针使用过程中很容易出错而且自己又很难发现的一个易疏忽问题———–即:指针人为的更改了原来的指向地址。以下是一个很好的案例,其中红色字体为正确解。问题:用mallo...

slagga ⋅ 06/05 ⋅ 0

PHP 5.5 新特性

PHP5.5 前不久前刚刚发布,里面的新特性有什么?官方文档在这里: http://www.php.net/manual/zh/migration55.new-features.php 1 生成器 yield关键字 yield的中文文档在这里:http://php.ne...

王二狗子11 ⋅ 01/07 ⋅ 0

delphi pchar char byte string转换问题

delphi pchar char byte string转换问题 注:Delphi中的Char,PChar,PByte,Byte,String的相互转换,您是不是也遇到过,为此头疼过吗?你要是明白了他们的原理就会轻松了。 话题064840的标题是...

鹅倌 ⋅ 2017/01/06 ⋅ 0

Android面试相关知识

最近面试被问到的问题,整理了一下。 1. AIDL原理 2. 跨进程通信,AIDL、Intent、Broadcast、Content Provider 3. Android设计模式 4. MVC、MVP、MVVM,Google官方开源代码 5. 事件传递机制 ...

xingjm8511 ⋅ 2016/07/18 ⋅ 0

Android Binder面试详解

一、Linux内核的基础知识 1、进程隔离/虚拟地址空间 2、系统调用 3、Linux跨进程通信机制 目前linux支持的IPC包括传统的管道、System V IPC、即消息队列/共享内存/信号量,以及socket中只有s...

千涯秋瑟 ⋅ 2017/12/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(十)JavaScript的DOM基础

JavaScript零基础入门——(十)JavaScript的DOM基础 欢迎大家回到我们的JavaScript零基础入门,上一节课,我们了解了JavaScript中的函数,这一节课,我们来了解一下JavaScript的DOM。 第一节...

JandenMa ⋅ 今天 ⋅ 0

Spring mvc DispatchServlet 实现原理

在Spring中, ContextLoaderListener只是辅助类,在web 容器启动的时候查找并创建WebApplicationContext对象,通过该对象进行加载spring的配置文件。而真正的逻辑实现其实是在DispatcherSer...

轨迹_ ⋅ 今天 ⋅ 0

Weex起步

本教程假设你已经在你的本地环境安装了node 其实weex起步教程在 https://github.com/lilugirl/incubator-weex 项目说明文件中都已经有了,但为了有些同学看到英文秒变文盲,所以这里我重新写...

lilugirl ⋅ 今天 ⋅ 0

Jenkins实践1 之安装

1 下载 http://mirrors.jenkins.io/war/latest/jenkins.war 2 启动 java -jar jenkins.war 前提:安装jdk并配置环境变量 启动结果节选: ************************************************......

晨猫 ⋅ 今天 ⋅ 0

组合数学 1-2000 中,能被6或10整除的数的个数

1--2000 中,能被6或10整除的数的个数 利用集合的性质 能被6整除的个数 2000/6 = 333 能被10整除的个数 2000/10 = 200 能被6和10整除的个数 2000/30 = 66 能被6或10整除的个数 333+200-66 =...

阿豪boy ⋅ 今天 ⋅ 0

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 今天 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部