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

作者:怀化淘贝游戏开发公司 阅读:166 次 发布时间:2023-05-15 15:46:26

摘要:  在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 "), GetLastError());

   goto EXIT;

   }

   //创建文件映射对象

   hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READWRITE,

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

   if (hFileMapping == NULL)

   {

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

   goto EXIT;

   }

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

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

   if (pSharedMem == NULL)

   {

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

   goto EXIT;

   }

  EXIT:

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

   return pSharedMem;

  }

  总结

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

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

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

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

    CTAPP999

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

    微信联系

    在线咨询

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


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


    在线咨询

    免费通话


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


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

    免费通话
    返回顶部