您的位置:首页 > 其它

使用内存映射文件在进程间传递数据流(开发笔记)

2010-04-08 16:25 477 查看
有关内存映射(注意,是有关,没说要全部用上)的六个函数:

CreateFileMapping

MapViewOfFile

FlushViewOfFile

UnmapViewOfFile

OpenFileMapping

CloseHandle

用于保护共享资源的内核变量,可以用Mutex, Event,等,网上有人用消息,但只局限于能接收消息的进程。我选了Mutex。

与Mutex有关的五个函数:

CreateMutex

OpenMutex

WaitForSingleObject

LeaveSingleObject

CloseHandle

要注意的:

1. CreateFileMapping –
因为我们不去映射物理文件(没有物理文件,而且为了传递的效率,也不推荐用物理文件),第一个参数必须是INVALID_HANDLE_VALUE。
MSDN是这样说的: CreateFileMapping creates a file mapping object of a
specified size that is backed by the system paging file。
(CreateFileMapping从系统页上创建一个给定大小的文件映射对象)。
实际上,CreateFileMapping只是告诉系统保留一块内存区域,注意,是保留,并未指定。我的理解是:CreateFileMapping告诉系统“我要用一块XXX大小的内存,请帮我看看能给我这么大不?”,要强调的是,调用CreateFileMapping后,系统并未承诺给你哪一块内存。打个比方:如果你想要一块1024bytes的内存,而在调用CreateFileMapping时,系统有两块大于1024bytes的连续的物理内存A和B,系统有可能给你用A,也有可能给你用B,也有可能都不是。这要到调用MapViewOfFile时才能决定。
返回的handle指向一个结构体实例的地址。该结构体描述了要保留的内存区域的大小,内存区域的首地址(此时尚未设置),等等。

2. MapViewOfFile – 拿到物理内存首地址。
必须要注意的是,MapViewOfFile会在当前满足条件(连续且不小于所请求大小)的若干个内存块中选一个返回给你,也就是说:不要以为CreateFileMapping后,即使频繁地调用MapViewOfFile/UnmapViewOfFile,你总能操作同一块内存。
可以这样理解:CreateFileMapping和MapViewOfFile分两步作了和new一块内存相同的事情。
MapViewOfFile后,handle(由CreateFileMapping返回)指向的结构体的一些成员的值会被更新,如设置内存首地址等。

3. UnmapViewOfFile –
就象delete一样,将MapViewOfFile返回的内存区域释放给操作系统。与delete不同的是,如果当前只有这一块内存,系统在你调用CloseHandle关闭handle(由CreateFileMapping返回)或进程退出前,这块内存不会被别人申请走,它会留下来给你。但delete后,别人有可能拿走。但是,如果当前不只剩一块大小合适的内存,系统就不能保证这块内存不被别人拿走了。

4. FlushViewOfFile – 将更改从内存提交到物理文件。我们这里不用物理文件,所以用不着这个函数。

MSDN有一个例子,我认为它是错的:

ms-help://MS。VSCC.v90/MS.MSDNQTR.v90.en/memory/base/creating_named_shared_memory.htm

要传递数据从进程A到进程B,上述函数的调用序列如下:

进程A

[3].gif]



进程B:

[3].gif]



进程A

.gif]



进程B:

.gif]

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: