文档章节

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

涂孟超
 涂孟超
发布于 2014/09/26 15:37
字数 591
阅读 10
收藏 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
博文 2011
码字总数 14107
作品 0
深圳
程序员
私信 提问
Android窗口管理分析(4):Android View绘制内存的分配、传递、使用

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

看书的小蜗牛
2017/10/20
0
0
一个进程间同步和通讯的 C# 框架

threadmsg_demo.zip ~ 41KB 下载 threadmsg_src.zip ~ 65KB 下载 0.背景简介 微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁。但跨进程的同步方法...

oschina
2013/02/07
18.2K
11
用好Delphi中的字符串

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

vga
2016/08/09
14
0
QShareMemory 学习

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

长平狐
2013/01/11
590
0
Android面试相关知识

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

xingjm8511
2016/07/18
44
0

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
今天
20
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
今天
20
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
30
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
36
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部