如何使用“CreateFileMapping”在Windows操作系统下创建共享内存?

作者:昭通淘贝游戏开发公司 阅读:113 次 发布时间:2023-05-27 21:55:41

摘要:在Windows操作系统下,共享内存是一种特殊的内存形式,它允许不同进程之间共享内存数据,从而提高程序的性能和效率。而“CreateFileMapping”是Windows提供的一个API函数,可以用来创建和管理共享内存,下面我们就来详细介绍一下如何使用“CreateFileMapping”在Windows操作系...

在Windows操作系统下,共享内存是一种特殊的内存形式,它允许不同进程之间共享内存数据,从而提高程序的性能和效率。而“CreateFileMapping”是Windows提供的一个API函数,可以用来创建和管理共享内存,下面我们就来详细介绍一下如何使用“CreateFileMapping”在Windows操作系统下创建共享内存的方法。

如何使用“CreateFileMapping”在Windows操作系统下创建共享内存?

一、什么是共享内存?

共享内存是一种内存分配方式,它允许多个进程共享同一块内存。在多进程操作中,共享内存技术可以提供一种快速的、简单的通讯方式,避免了进程间数据的复制和传递,从而节省了系统开销,提高了程序的性能。

二、“CreateFileMapping”函数概述

“CreateFileMapping”函数是Windows提供的一个API函数,它可以用来创建一个文件映射对象,从而创建共享内存。该函数的声明如下:

HANDLE CreateFileMapping(

HANDLE hFile,

LPSECURITY_ATTRIBUTES lpFileMappingAttributes,

DWORD flProtect,

DWORD dwMaximumSizeHigh,

DWORD dwMaximumSizeLow,

LPCTSTR lpName

);

其中,各个参数的含义如下:

(1)hFile:文件句柄,如果设置为INVALID_HANDLE_VALUE,则该函数创建一个无法访问的、匿名的共享内存对象。

(2)lpFileMappingAttributes:指向SECURITY_ATTRIBUTES结构的指针。如果该参数为空,则共享内存对象不能被继承到其他进程中。

(3)flProtect:指定共享内存对象的访问属性,取值可以是以下之一:

PAGE_READONLY:表示共享内存对象是只读的,其他进程不能修改。

PAGE_READWRITE:表示共享内存对象是可读写的。

PAGE_WRITECOPY:表示共享内存对象是写时复制的,即当一个进程试图写入共享内存时,系统会创建这个进程的私有副本并进行写操作。

(4)dwMaximumSizeHigh:指定共享内存对象的最大大小(高位DWORD)。

(5)dwMaximumSizeLow:指定共享内存对象的最大大小(低位DWORD)。

(6)lpName:指定共享内存对象的名称。

该函数的返回值是一个HANDLE类型的句柄,用来标识共享内存对象。如果函数执行失败,则返回值为NULL。

三、创建共享内存的步骤

下面介绍如何使用“CreateFileMapping”函数在Windows操作系统下创建共享内存对象的步骤:

步骤1:打开或创建一个文件。

如果要创建一个无法访问的、匿名的共享内存对象,那么可以将该参数设置为INVALID_HANDLE_VALUE,否则需要先打开一个已经存在的文件。

步骤2:创建一个文件映射对象。

调用“CreateFileMapping”函数来创建一个共享内存对象,并将其返回的句柄保存在一个变量中,以便后续使用。

步骤3:将共享内存映射到进程的虚拟地址空间。

调用“MapViewOfFile”函数将共享内存映射到进程的虚拟地址空间中,从而使该进程可以访问共享内存中的数据。

步骤4:使用共享内存进行进程间通讯。

多个进程都可以通过共享内存进行数据的交换和共享。

四、示例代码

下面我们提供一个示例代码,演示如何使用“CreateFileMapping”函数在Windows操作系统下创建共享内存对象:

//创建共享内存

void* CreateSharedMemory()

{

HANDLE hFile = INVALID_HANDLE_VALUE;

HANDLE hFileMapping = NULL;

void* pSharedMem = NULL;

//打开或创建文件

hFile = CreateFile(_T("SharedMemory.bin"), GENERIC_READ|GENERIC_WRITE,

FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

if (hFile == INVALID_HANDLE_VALUE)

{

_tprintf(_T("CreateFile failed, error=%d\n"), GetLastError());

goto EXIT;

}

//创建文件映射对象

hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE,

0, SHARED_MEM_SIZE, _T("SharedMemory"));

if (hFileMapping == NULL)

{

_tprintf(_T("CreateFileMapping failed, error=%d\n"), GetLastError());

goto EXIT;

}

//将共享内存映射到进程的虚拟地址空间

pSharedMem = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, SHARED_MEM_SIZE);

if (pSharedMem == NULL)

{

_tprintf(_T("MapViewOfFile failed, error=%d\n"), GetLastError());

goto EXIT;

}

EXIT:

if (hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);

return pSharedMem;

}

总结

共享内存是一种特殊的内存分配方式,可以提供一种快速的、简单的进程间通讯方式,从而提高程序的性能。在Windows操作系统下,可以使用“CreateFileMapping”函数来创建共享内存对象,并通过“MapViewOfFile”函数将其映射到进程的虚拟地址空间。在使用共享内存时,需要注意不同进程间对共享内存的读写和同步问题,以避免出现冲突和错误。

  • 原标题:如何使用“CreateFileMapping”在Windows操作系统下创建共享内存?

  • 本文链接:https://qipaikaifa1.com/tb/7750.html

  • 本文由昭通淘贝游戏开发公司小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与淘贝科技联系删除。
  • 微信二维码

    CTAPP999

    长按复制微信号,添加好友

    微信联系

    在线咨询

    点击这里给我发消息QQ客服专员


    点击这里给我发消息电话客服专员


    在线咨询

    免费通话


    24h咨询☎️:189-2934-0276


    🔺🔺 棋牌游戏开发24H咨询电话 🔺🔺

    免费通话
    返回顶部