这是project1/2两个程序的code,在unit1里可以show出是windows 98,面在
unit2里却是空的呢!真烦!unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TShared = record
Keys:array [0..5] of String;
end;
PShared = ^TShared;
const
HOOK_MD5_FILENAME='2uwofj';
var
Form1: TForm1;
Shared: PShared;
lp:THandle;
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(Shared^.Keys[3]);
end;procedure TForm1.FormCreate(Sender: TObject);
begin
lp:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MD5_FILENAME);
if lp=0 then
begin
lp:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0,256, HOOK_MD5_FILENAME);
end;
if lp<>0 then
Shared:=MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0);
Shared^.Keys[0]:='windows xp';
Shared^.Keys[1]:='windows 2000';
Shared^.Keys[2]:='windows 7';
Shared^.Keys[3]:='windows 98';
Shared^.Keys[4]:='windows 2003';
Shared^.Keys[5]:='windows server 10';
end;end.unit Unit2;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm2 = class(TForm)
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TShared = record
Keys:array [0..5] of String;
end;
PShared =^TShared;
const
HOOK_MD5_FILENAME='2uwofj';
var
Form2: TForm2;
Shared: PShared;
lp:THandle;implementation{$R *.dfm}
procedure TForm2.Button1Click(Sender: TObject);
begin
ShowMessage(Shared^.Keys[3]);
end;procedure TForm2.FormCreate(Sender: TObject);
begin
lp:=OpenFileMapping(FILE_MAP_ALL_ACCESS,False, HOOK_MD5_FILENAME);
if lp<>0 then
Shared:=MapViewOfFile(lp,FILE_MAP_ALL_ACCESS,0,0,0);
end;end.

解决方案 »

  1.   

    delphi的String缺省是长String,它是动态分配内存的(实际上是一个指针),在project1中,Keys:array [0..5] of String;都是指向自己的内存区域(非共享区),它的Shared^.Keys[3]是可以显示的;
    而在程序2中,Keys:array [0..5] of String;指向了自身的内存区域(非共享区),它的内容当然不对了.
    最简的方法,是将String改成短String,这样它就直接定义在Shared中了(共享区),程序就可以正常显示了
    改上面二个Shared为:
    TShared = record
    Keys:array [0..5] of String[40];  //短String
    end;