博得一笑

编程只为博得一笑

所有的代码都自己敲……
    所有的BUG都自己找……
 

博得写的博客

写博客的博得
2005自制游戏《小鱼蛋与小仙女》 下载  Hot      学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!!  New Cool Hot
关于进程间共享数据的研究。

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

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

范例:
dll.h
class testFileMapping
{
private:
    HANDLE hMapping;
    LPVOID lpData; 
public:
    
bool init();

    
void set(int idx,int val);

    
int get(int idx);

    testFileMapping();
    
~testFileMapping();
}
;

MY_API HANDLE InitFileMapping();

MY_API 
void SetFileMapping(HANDLE hMap,int idx,int val);

MY_API 
int GetFileMapping(HANDLE hMap,int idx);

MY_API 
void CleanFileMapping(HANDLE hMap);
dll.cpp

bool testFileMapping::init()
{
    hMapping
=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(int)*100,L"MYSHARE");   
    
if(hMapping==NULL)   
    
{   
        
return false;
    }
   
    lpData
=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
    
if(lpData==NULL)   
    
{   
        
return false
    }
   
}


void testFileMapping::set(int idx, int val)
{
    
int* tp = (int*)lpData;
    tp[idx] 
= val;
}


int testFileMapping::get(int idx)
{
    
int* tp = (int*)lpData;
    
return tp[idx];
}


testFileMapping::testFileMapping()
{
    hMapping 
= NULL;
    lpData 
= NULL;
}


testFileMapping::
~testFileMapping()
{
    
if(NULL != lpData)
    
{
        UnmapViewOfFile(lpData);
        lpData 
= NULL;
    }

    
if(NULL != hMapping)
    
{
        CloseHandle(hMapping);
        hMapping 
= NULL;
    }

}


MY_API HANDLE InitFileMapping()
{
    testFileMapping
* tp = new testFileMapping();
    tp
->init();
    
return tp;
}


MY_API 
void SetFileMapping(HANDLE hMap,int idx,int val)
{
    ((testFileMapping
*)hMap)->set(idx,val);
}


MY_API 
int GetFileMapping(HANDLE hMap,int idx)
{
    
return ((testFileMapping*)hMap)->get(idx);
}


MY_API 
void CleanFileMapping(HANDLE hMap)
{
    delete ((testFileMapping
*)hMap);
}



编译为dll后,在不同的程序中调用,就可以共享一块大小为100的int数组。因为没有加边界控制,所以检查了一下边界条件,发现其实可以访问的内存是大小为1024的int数组,也就是x86页面文件的大小4KB。当然这样的访问是不安全的,应该在程序中加以屏蔽。
posted on 2007-01-31 14:52  博得一笑  阅读(490)  评论(0编辑  收藏  举报