惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

G
Google Developers Blog
博客园 - 三生石上(FineUI控件)
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
MongoDB | Blog
MongoDB | Blog
小众软件
小众软件
Y
Y Combinator Blog
博客园 - 聂微东
Google DeepMind News
Google DeepMind News
D
Docker
罗磊的独立博客
Microsoft Security Blog
Microsoft Security Blog
D
DataBreaches.Net
B
Blog
Vercel News
Vercel News
Recent Announcements
Recent Announcements
GbyAI
GbyAI
阮一峰的网络日志
阮一峰的网络日志
T
The Blog of Author Tim Ferriss
H
Hackread – Cybersecurity News, Data Breaches, AI and More
P
Proofpoint News Feed
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Microsoft Azure Blog
Microsoft Azure Blog
宝玉的分享
宝玉的分享

博客园 - 博得一笑

Bode's Online Judge Core Engine Bate2 Publish! 在线评测系统核心引擎测试二版发布! Bode's Online Judge Core Engine (Judge Engine Dynamic Link Library) 在线评测系统核心引擎 来介绍个网游:英语情境教学网游——《乌龙学院》 近期任务 维基百科中的上师大条目中发现的严重纰漏!!! 《Windows核心编程》读书笔记(一) 看了一下MD5加密算法的介绍,然后顺手把C实现改成了个C++类。 伊拉克通俗演义——关于大国霸权的思考 学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!! GCC研究使用笔记 感谢LILY为学思湖怪设计的漂亮封面! ^o^ 学思湖怪超COOL文字生成器2正式版 发布啦!!! 关于[学思湖怪超COOL文字生成器2_Beta2]发布的一些说明 ^c^ 新版本“学思湖怪”文字生成器开始测试! 上机时的无聊之作。。。 博得写博客整整一年了…… 圆梦时分 ——写在自制游戏推出半年后 博客笑将要添加的一个功能。 C#中如何打开一个未知编码的文本文件。
《Windows核心编程》读书笔记(二)
博得一笑 · 2007-01-31 · via 博客园 - 博得一笑

关于进程间共享数据的研究。

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

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

范例:
dll.h

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。当然这样的访问是不安全的,应该在程序中加以屏蔽。