DLL浅析(3)
在Win32中,每个应用程序进程把DLL映射到自己的地址空间中,DLL的数据也映射到了应用程序进程空间中,所以每个应用程序
拥有自己的DLL数据实例。一个应用程序对DLL中的全局数据进行修改都不会影响其他应用程序。这带来一定安全性,不过这又使得我们
不能共享DLL全局数据。然而我们仍可以通过使用内存映射文件来存储共享数据,从而达到进程间通信的目的(当然还有很多其他方法)。
当应用程序载入一个DLL时,如果该DLL创建了内存映射文件,那么当另一个应用程序载入该DLL时,也可以使用同样的内存映射文件(当然也可以不同),
这样内存中就存在两个DLL映像,分别对应着调用它们的应用程序,这两个DLL拥有相同的内存映射文件实例。DLL可以生成被映射文件引用的数据,而
调用DLL的应用程序可以访问映射文件。当一个应用程序修改了共享数据,其他载入该DLL的应用程序就可以察觉到数据的变化。
type
PShareDLLRecord = ^TShareDLLRecord;
TShareDLLRecord = Record
//你需要定义的数据;
end;
var
DLLData: PShareDLLRecord;
MapHandle: THandle;
procedure OpenShareData;
begin
//CreateFileMapping函数创建文件影像对象,并返回该对象的句柄。
MapHandle:=CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, sizeof(TShareDLLRecord), 'TestMap');
if MapHandle<>0 then
begin
//MapViewOfFile函数映射文件视图到调用进程的地址空间中,并返回该地址空间的手地
DLLData:=MapViewOfFile(MapHandle,FILE_MAP_ALL_ACCESS,0,0,0);
if DLLData=nil then
CloseHandle(MapHandle);
else //在这里你可以往MapHandle中写入自己的数据(即为提供共享数据)。
end
else if GetLastError = ERROR_ALREADY_EXISTS then
begin
MapHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'TestMap');
if MapHandle = 0 then
Exit;
else //在这里你可以获取数据并做其他处理,同时如果需要你也可以往MapHandle中写入自己的数据(即修改共享数据);
end
end;
关于这里的Win32 API函数的参数,具体参阅MSDN。
浙公网安备 33010602011771号