shaotao的历程 - 不断学习新知识

学习需要过程,而我需要一个博客来记录这个过程!

导航

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。

posted on 2009-10-17 23:10  shaotao  阅读(332)  评论(0)    收藏  举报