教:怎么利用createfilemapping来在两个不同的进程共享图像数据? 哈,刚好我前几天也在用这个函数写程序共享数据.等等,我把例子拷给你... 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 两个恐龙共享数据.呵呵.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. delphi 批量导出到EXCEL,在另存为最后一个文件退出时有时报错有时正常.请教.... 【XML相关】XML绑定的问题 【可儿MM】我有一个心愿。。。 下面代码如何简化比较合理 请教关于批处理的问题,在线等~ Pchar和String类型之间的相互转换 有关数据库缓存文件报错?(再次)有高分给! 有用过themeengine控件的进来看看 关于Dbgrid显示的问题? 关于delphi中赋值存在的问题? 想得分的请进!! 求(paradox)SQL语句
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.