《Windows核心编程》读书笔记(二)

时间:2021-08-25 21:07:07
关于进程间共享数据的研究。

昨天看了用共享节的方式共享静态数据,但是这个方法安全性不高,而且无法适用于需要动态分配大块内存的情况。

今天尝试了一下内存映射文件,发现可以很好的解决这个问题。

范例:
dll.h
《Windows核心编程》读书笔记(二)class  testFileMapping
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)
private:
《Windows核心编程》读书笔记(二)    HANDLE hMapping;
《Windows核心编程》读书笔记(二)    LPVOID lpData; 
《Windows核心编程》读书笔记(二)
public:
《Windows核心编程》读书笔记(二)    
bool init();
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)    
void set(int idx,int val);
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)    
int get(int idx);
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)    testFileMapping();
《Windows核心编程》读书笔记(二)    
~testFileMapping();
《Windows核心编程》读书笔记(二)}
;
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API HANDLE InitFileMapping();
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
void  SetFileMapping(HANDLE hMap, int  idx, int  val);
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
int  GetFileMapping(HANDLE hMap, int  idx);
《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
void  CleanFileMapping(HANDLE hMap);
dll.cpp

《Windows核心编程》读书笔记(二)bool testFileMapping::init()
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    hMapping
=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(int)*100,L"MYSHARE");   
《Windows核心编程》读书笔记(二)    
if(hMapping==NULL)   
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)    
{   
《Windows核心编程》读书笔记(二)        
return false;
《Windows核心编程》读书笔记(二)    }
   
《Windows核心编程》读书笔记(二)    lpData
=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
《Windows核心编程》读书笔记(二)    
if(lpData==NULL)   
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)    
{   
《Windows核心编程》读书笔记(二)        
return false
《Windows核心编程》读书笔记(二)    }
   
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)
void testFileMapping::set(int idx, int val)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    
int* tp = (int*)lpData;
《Windows核心编程》读书笔记(二)    tp[idx] 
= val;
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)
int testFileMapping::get(int idx)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    
int* tp = (int*)lpData;
《Windows核心编程》读书笔记(二)    
return tp[idx];
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)testFileMapping::testFileMapping()
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    hMapping 
= NULL;
《Windows核心编程》读书笔记(二)    lpData 
= NULL;
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)testFileMapping::
~testFileMapping()
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    
if(NULL != lpData)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)    
{
《Windows核心编程》读书笔记(二)        UnmapViewOfFile(lpData);
《Windows核心编程》读书笔记(二)        lpData 
= NULL;
《Windows核心编程》读书笔记(二)    }

《Windows核心编程》读书笔记(二)    
if(NULL != hMapping)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)    
{
《Windows核心编程》读书笔记(二)        CloseHandle(hMapping);
《Windows核心编程》读书笔记(二)        hMapping 
= NULL;
《Windows核心编程》读书笔记(二)    }

《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API HANDLE InitFileMapping()
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    testFileMapping
* tp = new testFileMapping();
《Windows核心编程》读书笔记(二)    tp
->init();
《Windows核心编程》读书笔记(二)    
return tp;
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
void SetFileMapping(HANDLE hMap,int idx,int val)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    ((testFileMapping
*)hMap)->set(idx,val);
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
int GetFileMapping(HANDLE hMap,int idx)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    
return ((testFileMapping*)hMap)->get(idx);
《Windows核心编程》读书笔记(二)}

《Windows核心编程》读书笔记(二)
《Windows核心编程》读书笔记(二)MY_API 
void CleanFileMapping(HANDLE hMap)
《Windows核心编程》读书笔记(二)《Windows核心编程》读书笔记(二)
{
《Windows核心编程》读书笔记(二)    delete ((testFileMapping
*)hMap);
《Windows核心编程》读书笔记(二)}



编译为dll后,在不同的程序中调用,就可以共享一块大小为100的int数组。因为没有加边界控制,所以检查了一下边界条件,发现其实可以访问的内存是大小为1024的int数组,也就是x86页面文件的大小4KB。当然这样的访问是不安全的,应该在程序中加以屏蔽。