• 两个exe共享内存数据


    unit Unit1;
    
    
    
    interface
    
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, 
      StdCtrls;
    const
      WM_DATA=WM_USER+1025;
    
    
    type
      PShareMem=^TShareMem;
      TShareMem=record
        Data:array[0..255] of char;
      end;
      TForm1 = class(TForm)
        Button1: TButton;
        edt1: TEdit;
        //Button1: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
    
    
    var
      Form1: TForm1;
      pshare: PShareMem;
    
    
    implementation
    
    
    {$R *.dfm}
    var
      hmapping:THandle;
      hmapmutex:THandle;
    const
      mapfilesize=1000;
      request_timeout=1000;
    
    
    procedure openMap;
    begin
      hmapping :=createFileMapping($FFFFFFFF,nil,PAGE_READWRITE,0,SizeOf(TShareMem),
      pchar('map pei'));
      if hmapping=0 then
      begin
        showMessage('创建内存映像文件失败');
        Application.Terminate;
      end;
      //将影像文件映射到进程的地址空间
      pshare := PShareMem(mapviewoffile(hmapping,FILE_MAP_ALL_ACCESS,0,0,0));
      if pshare=nil then
      begin
        closehandle(hmapping);
        showmessage('显示内存映像文件失败');
        application.Terminate;
        exit;
      end;
    end;
    
    
    procedure closeMap;    //关闭共享内存映像
    begin
      if pshare<>nil then
        unmapviewoffile(pshare);      // 从进程地址空间中释放映像文件
      if hmapping<>0 then
         closehandle(hmapping);
    
    
    end;
    
    
    function LockMap:boolean;
    begin
      result:=true;
      hmapmutex:=createMutex(nil,false,pchar('mutex peidw'));
      if hmapmutex=0 then
      begin
        showmessage('创建互斥对象失败');
        result:=false;
      end
      else
      begin
         if waitforsingleObject(hmapmutex,request_timeout)=WAIT_FAILED then
         begin
            showmessage('对互斥对象加锁失败');
            result:=false;
         end;
      end;   //if end
    
    
    end;
    
    
    procedure unLockMap;//释放互斥对象
    begin
      releaseMutex(hmapmutex);
      closeHandle(hmapmutex);
    end;
    
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      str:pchar;
    begin
      //str:=pchar('简单的内存共享例子');
      str:= PChar(edt1.Text);
      copyMemory(@(pshare^.Data),str,length(str));
      postMessage(findWindow(nil,'Form2'),WM_DATA,1,1);
    
    
    end;
    
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      openMap;
      LockMap;
    end;
    
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
        unLockMap;
        closeMap;
    end;
    
    
    end.
    
    
    
    
    
    unit Unit2;
    
    
    interface
    
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics,
      Controls, Forms, Dialogs, StdCtrls;
    const
      WM_DATA=WM_USER+1025;
    type
      PShareMem=^TShareMem;
      TShareMem=record
        Data:array[0..255] of char;
      end;
    
    
      TForm2 = class(TForm)
        //Memo1: TMemo;
        Button1: TButton;
        memo1: TMemo;
        //Button1: TButton;
        procedure FormCreate(Sender: TObject);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        procedure getShareInfo(var msg:TMessage); message WM_DATA;
      end;
    
    
    var
      Form2: TForm2;
      pshare: PShareMem;
      hmapping:THandle;
    implementation
    
    
    {$R *.dfm}
    procedure TForm2.Button1Click(Sender: TObject);
    begin
      closehandle(hmapping);
      close;
    end;
    
    
    procedure TForm2.FormCreate(Sender: TObject);
    begin
      hmapping :=openFileMapping(File_MAP_WRITE,false,pchar('map pei'));
      if hmapping=0 then
      begin
        showMessage('定位内存映像文件块失败');
        halt; //异常终止
      end;
     //将影像文件映射到进程的地址空间
      pshare := PShareMem(mapviewoffile(hmapping,FILE_MAP_ALL_ACCESS,0,0,0));
      if pshare=nil then
      begin
        closehandle(hmapping);
        showmessage('将映像映射到进程地址空间失败');
        application.Terminate;
        exit;
      end;
      fillchar(pshare^,sizeof(TShareMem),0);//初始化地址空间
    end;
    
    
    procedure  TForm2.getShareInfo(var msg: TMessage);
    begin
      if msg.LParam=1 then
        memo1.Lines.add(pshare^.Data);
    end;
    end.
    书搞进脑袋 创新 创造; 积极
  • 相关阅读:
    网站SEO关键词优化技巧
    SEO操作流程及网站优化技巧
    Linux服务器工作常用命令总结
    【转载】Linux常用命令大全(非常全!!!)
    myBatis出现Mapped Statements collection already contains value for
    maven打成war包之后没有class文件
    查询每个类型最新的一条记录
    关于 MySQL 的 boolean 和 tinyint(1) (转)
    Mac下的eclipse按住ctrl点击无法查看类文件
    Mac 10.10下安装MySQL5.6.21提示安装失败
  • 原文地址:https://www.cnblogs.com/tobetterlife/p/12170286.html
Copyright © 2020-2023  润新知