昨天看了用共享节的方式共享静态数据,但是这个方法安全性不高,而且无法适用于需要动态分配大块内存的情况。
今天尝试了一下内存映射文件,发现可以很好的解决这个问题。
范例:
dll.h
 class testFileMapping
class testFileMapping {
{ private:
private: HANDLE hMapping;
    HANDLE hMapping; LPVOID lpData;
    LPVOID lpData;  public:
public: bool init();
    bool init();
 void set(int idx,int val);
    void set(int idx,int val);
 int get(int idx);
    int get(int idx);
 testFileMapping();
    testFileMapping(); ~testFileMapping();
    ~testFileMapping(); };
};
 MY_API HANDLE InitFileMapping();
MY_API HANDLE InitFileMapping();
 MY_API void SetFileMapping(HANDLE hMap,int idx,int val);
MY_API void SetFileMapping(HANDLE hMap,int idx,int val);
 MY_API int GetFileMapping(HANDLE hMap,int idx);
MY_API int GetFileMapping(HANDLE hMap,int idx);
 MY_API void CleanFileMapping(HANDLE hMap);
MY_API void CleanFileMapping(HANDLE hMap); bool testFileMapping::init()
bool testFileMapping::init() {
{ hMapping=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(int)*100,L"MYSHARE");
    hMapping=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(int)*100,L"MYSHARE");    if(hMapping==NULL)
    if(hMapping==NULL)    {
    {    return false;
        return false; }
    }    lpData=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);
    lpData=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);    if(lpData==NULL)
    if(lpData==NULL)    {
    {    return false;
        return false;  }
    }    }
}
 void testFileMapping::set(int idx, int val)
void testFileMapping::set(int idx, int val) {
{ int* tp = (int*)lpData;
    int* tp = (int*)lpData; tp[idx] = val;
    tp[idx] = val; }
}
 int testFileMapping::get(int idx)
int testFileMapping::get(int idx) {
{ int* tp = (int*)lpData;
    int* tp = (int*)lpData; return tp[idx];
    return tp[idx]; }
}
 testFileMapping::testFileMapping()
testFileMapping::testFileMapping() {
{ hMapping = NULL;
    hMapping = NULL; lpData = NULL;
    lpData = NULL; }
}
 testFileMapping::~testFileMapping()
testFileMapping::~testFileMapping() {
{ if(NULL != lpData)
    if(NULL != lpData) {
    { UnmapViewOfFile(lpData);
        UnmapViewOfFile(lpData); lpData = NULL;
        lpData = NULL; }
    } if(NULL != hMapping)
    if(NULL != hMapping) {
    { CloseHandle(hMapping);
        CloseHandle(hMapping); hMapping = NULL;
        hMapping = NULL; }
    } }
}
 MY_API HANDLE InitFileMapping()
MY_API HANDLE InitFileMapping() {
{ testFileMapping* tp = new testFileMapping();
    testFileMapping* tp = new testFileMapping(); tp->init();
    tp->init(); return tp;
    return tp; }
}
 MY_API void SetFileMapping(HANDLE hMap,int idx,int val)
MY_API void SetFileMapping(HANDLE hMap,int idx,int val) {
{ ((testFileMapping*)hMap)->set(idx,val);
    ((testFileMapping*)hMap)->set(idx,val); }
}
 MY_API int GetFileMapping(HANDLE hMap,int idx)
MY_API int GetFileMapping(HANDLE hMap,int idx) {
{ return ((testFileMapping*)hMap)->get(idx);
    return ((testFileMapping*)hMap)->get(idx); }
}
 MY_API void CleanFileMapping(HANDLE hMap)
MY_API void CleanFileMapping(HANDLE hMap) {
{ delete ((testFileMapping*)hMap);
    delete ((testFileMapping*)hMap); }
}
编译为dll后,在不同的程序中调用,就可以共享一块大小为100的int数组。因为没有加边界控制,所以检查了一下边界条件,发现其实可以访问的内存是大小为1024的int数组,也就是x86页面文件的大小4KB。当然这样的访问是不安全的,应该在程序中加以屏蔽。
 
                    
                     
                    
                 
                    
                 


 
     
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号