哈,刚好我前几天也在用这个函数写程序共享数据.
等等,我把例子拷给你...

解决方案 »

  1.   

    两个恐龙共享数据.呵呵.unit FileMapping;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, DB, DBTables, Grids, DBGrids, StdCtrls, Math;type
      ArrCharMemory    = array[0..150] of char;
      ApointerMemory   = ^ArrCharMemory;  TForm1 = class(TForm)
        DBGrid1: TDBGrid;
        DataSource1: TDataSource;
        Query1: TQuery;
        Database1: TDatabase;
        Button1: TButton;
        Query2: TQuery;
        procedure Button1Click(Sender: TObject);
      private
        function strtobit(str:string):string;
        procedure CreateHICMEMORY(QueryFirst:TQuery;QuerySec:TQuery);
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationfunction TForm1.strtobit(str:string):string;
    var
            i,num,int:integer;
    begin
            int:=0;
            num:=length(str);
            for i:=1 to num do
            begin
              if copy(str,i,1)='1' then
                 int:=int+(($01) shl (num-i));
            end;
            strtobit:=inttohex(int,2);
    end;procedure TForm1.CreateHICMEMORY(QueryFirst:TQuery;QuerySec:TQuery);
    var
            FileHandle : THANDLE;
            FHand      : THANDLE;
            Str        : AnsiString;
            StrTemp    : AnsiString;
            StrRoot    : AnsiString;
            iout       : Integer;
            iData      : Integer;
            p          : pointer;
            CharTemp   : ArrCharMemory;
    //测试用变量
            readHandle : THANDLE;
            readP      : pointer;
    begin
            //获得目录
            StrRoot := GetCurrentDir();
            if (StrRoot[Length(StrRoot)]<>'\')then StrRoot := StrRoot+'\';
            StrRoot := StrRoot+'HicMemory.tmp';
            //创建文件
            FileHandle := CreateFile(PChar(StrRoot),GENERIC_READ or GENERIC_WRITE,FILE_SHARE_WRITE,nil,CREATE_ALWAYS,FILE_ATTRIBUTE_TEMPORARY,handle);
            //创建内存空间
            FHand := CreateFileMapping(FileHandle,nil,PAGE_READWRITE,0,64*1024,PChar('HICMEMORY'));
            //映射
            p := MapViewOfFile(FHand,FILE_MAP_WRITE or FILE_MAP_READ,0,0,6400);
            //获取内容
            QueryFirst.Close ;
            QueryFirst.SQL.Clear ;
            QueryFirst.SQL.Add('select * from di_state order by hicno');
            try
              QueryFirst.Open;
            except
            end;
            iout :=0;
            Str := '';
            QueryFirst.First ;
            while (not QueryFirst.Eof) do
            begin
              if iout <> QueryFirst.FieldByName('HICNO').AsInteger then
              begin
                iData := 0 ;
                iout:= QueryFirst.FieldByName('HICNO').AsInteger ;
                Str := Str+'!'+Format('%.2d',[iout])+'00';
                QuerySec.Close ;
                QuerySec.SQL.Clear ;
                QuerySec.SQL.Add('select * from di_state where hicno='+IntToStr(iout)+' and state=1 order by dino');
                QuerySec.Open;
                QuerySec.First ;
                while (not QuerySec.Eof) do
                begin
                  iData := iData + Trunc(power(10,(QuerySec.FieldByName('dino').AsInteger -1)));
                  QuerySec.Next ;
                end;
                StrTemp := Format('%.8d',[idata]);
                Str := Str+ StrToBit(StrTemp) + #13#10;
              end;
              QueryFirst.Next ;
            end;
            StrPCopy(CharTemp,Str);
            //写映射
            ApointerMemory(p)^ := CharTemp;        //以下为读内存
            ShowMessage('Write:'+#10 + ApointerMemory(p)^);
            readHandle := OpenFileMapping(FILE_MAP_READ,false,PChar('HICMEMORY'));
            readP := MapViewOfFile(readHandle,FILE_MAP_READ,0,0,6400);
            ShowMessage('read :'+#10 + ApointerMemory(readP)^);end;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    begin
            CreateHicMemory(Query1,Query2);
    end;end.