这是个动态库
library Project1;
uses
  shareMem,
  windows,
  SysUtils,
  Classes;const
MFileName:Pchar = 'ShareData';
//定义一个记录类型,你所需要共享的数据就保存在这里。
//当在进程中调用GetDllData时,进程中也应该定义一个与这个一样的记录类型。
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = record
s: string[50];
i: integer;
end;var
GlobalData: PGlobalDllData; //这是一个全局变量,指向创建的内存映射文件。
MapHandle: THandle;
//给外部进程调用的过程,当外部进程调用这个过程后,形参AGlobalData就指向了我
//们创建的内存映射文件. 我们可以创建两个进程, 同时调用这个过程, 那么在其中一个进 //程中修改数据后, 在另外一个进程中既可反应出来, 实现了我们需要的共享.procedure GetDllData(var AGlobalData: PGlobalDllData);stdcall; begin
AGlobalData := GlobalData;
end;procedure OpenThisData;
var
size: integer;
begin
size := sizeof(TGlobalDllData);
//创建一个内存文件映射对象,MfileName保存的值就是该对象的名字。
mapHandle := CreateFileMapping(Dword(-1), nil, page_readWrite, 0, size, MFileName);
if mapHandle = 0 then
RaiseLastWin32Error;
//把文件的视图映射到调用进程的地址空间,该函数的返回值就是该对象的首地址。注//意,这是调用进程的地址,两个应用程序调用该DLL,返回值是不一样的。
GlobalData := MapViewOfFile(mapHandle, File_map_all_Access, 0, 0, size);
Globaldata^.s :='TEST';
GlobalData^.i := 5;
if GlobalData = nil then
begin
CloseHandle(MapHandle);
RaiseLastWin32Error;
end;
end;
//DLL从进程中分离出来时,应该释放相应的空间
procedure CloseThisData;
begin
unmapViewOfFile(GlobalData);
closeHandle(MapHandle);
end;procedure DllEntryPoint(dwReason: DWord);
begin
case dwReason of
Dll_Process_Attach: OpenThisData; //调用DLL时传入的参数,由系统自动传入
Dll_Process_Detach: CloseThisData; //释放DLL时传入的参数,系统自动传入。
end;
end;{$R *.res}exports
GetDllData; //外部应用程序调用的就是这个过程。begin
DllProc := @DllEntryPoint; //该变量是一个全局变量,由它来指定DLL的入口及出 //口函数。
DllEntryPoint(Dll_Process_Attach);
end.
==========================================================================================现在把动态库内
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = record
s: string[50];
i: integer;
改为一个
type
PGlobalDllData = ^TGlobalDllData;
TGlobalDllData = integer
当然其他代码也做相应的变动应用程序方面首先声明和动态库一样的类型,并声明一个变量PP

GetMem(pp, sizeof(integer));
GetDllData(pp);
pp^:=handle;
.......
.....
我测试了以下这样做改变不了动态库共享内存的值
为什么呢????????????????????????????????????