如何使用createfilemapping在Windows上创建共享内存?

作者:白城麻将开发公司 阅读:96 次 发布时间:2023-06-06 13:24:31

摘要:在 Windows 操作系统中,共享内存被广泛应用于各种应用程序中,特别是在多进程或多线程应用程序中。共享内存允许不同的应用程序在同一台计算机上共享内存中的数据,从而提高系统性能。在本文中,我们将介绍如何使用 createfilemapping 在 Windows 上创建共享内存。什么是 Cre...

在 Windows 操作系统中,共享内存被广泛应用于各种应用程序中,特别是在多进程或多线程应用程序中。共享内存允许不同的应用程序在同一台计算机上共享内存中的数据,从而提高系统性能。在本文中,我们将介绍如何使用 createfilemapping 在 Windows 上创建共享内存。

如何使用createfilemapping在Windows上创建共享内存?

什么是 CreateFileMapping?

CreateFileMapping 是 Windows API 中的一个函数,可以用来在程序之间共享内存。通过使用 CreateFileMapping,我们可以在程序之间传递数据,而无需复制数据或通过网络传输数据。CreateFileMapping 可以将共享内存映射到进程空间中,以便多个进程可以同时访问共享内存。

创建共享内存

要创建共享内存,我们需要调用 CreateFileMapping 函数。该函数接受以下四个参数:

1. HANDLE hFile:

句柄,指定文件或其他内核对象的句柄。

2. LPSECURITY_ATTRIBUTES lpFileMappingAttributes:

指向 SECURITY_ATTRIBUTES 结构体的指针,用于指定新文件映射对象的安全描述符。如果该参数为 NULL,则使用默认安全描述符。

3. DWORD flProtect:

指定文件映射对象的访问控制级别。可以使用以下参数之一来指定:

PAGE_READONLY:只读。

PAGE_READWRITE:可读可写。

PAGE_WRITECOPY:可读可拷贝。

PAGE_EXECUTE_READ:可执行可读。

PAGE_EXECUTE_READWRITE:可执行可读可写。

PAGE_EXECUTE_WRITECOPY:可执行读写拷贝。

4. DWORD dwMaximumSizeHigh, DWORD dwMaximumSizeLow:

指定映射文件的大小。可以通过将 dwMaximumSizeHigh 为 0,dwMaximumSizeLow 指定为要分配的内存大小,从而指定该值。如果映射文件大小为 0,则创建一个命名对象。

下面是一个示例,它演示了如何使用 CreateFileMapping 在 Windows 上创建共享内存。

```

HANDLE hMapFile;

LPCTSTR pBuf;

// 在共享内存中分配 1024 字节内存

hMapFile = CreateFileMapping(

INVALID_HANDLE_VALUE, // 使用系统页面文件作为其他对象的 backing store

NULL, // 安全属性

PAGE_READWRITE, // 读写访问权限

0, // 高位文件大小

1024, // 低位文件大小

"SampleSharedMemory"); // 共享内存名称

if (hMapFile == NULL)

{

printf("Could not create file mapping object (%d)\n", GetLastError());

return 1;

}

// 将共享内存连接到进程地址空间

pBuf = (LPTSTR) MapViewOfFile(

hMapFile, // 共享内存对象句柄

FILE_MAP_ALL_ACCESS, // 读写访问权限

0,

0,

1024);

if (pBuf == NULL)

{

printf("Could not map view of file (%d)\n", GetLastError());

CloseHandle(hMapFile);

return 1;

}

// 将数据写入共享内存

CopyMemory((PVOID)pBuf, "Hello World", sizeof("Hello World"));

// 释放共享内存

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

```

首先,我们调用 CreateFileMapping 函数来创建一个共享内存对象。参数中的 “SampleSharedMemory” 是共享内存对象的名称。

接下来,我们调用 MapViewOfFile 函数将共享内存连接到进程地址空间。注意,我们可以使用 MAP_ALL_ACCESS 参数指定可读可写的内存访问权限。

最后,我们通过调用 UnmapViewOfFile 函数和 CloseHandle 函数来释放共享内存。CopyMemory 函数用来将数据写入共享内存。

读取共享内存

要从共享内存中读取数据,我们需要打开共享内存对象并将其映射到进程地址空间中。我们可以使用以下代码从共享内存中读取数据。

```

HANDLE hMapFile;

LPCTSTR pBuf;

// 打开共享内存

hMapFile = OpenFileMapping(

FILE_MAP_ALL_ACCESS, // 读写访问权限

FALSE, // 不是要创建的文件映射对象

"SampleSharedMemory"); // 共享内存名称

if (hMapFile == NULL)

{

printf("Could not open file mapping object (%d)\n", GetLastError());

return 1;

}

// 将共享内存连接到进程地址空间

pBuf = (LPTSTR) MapViewOfFile(

hMapFile, // 共享内存对象句柄

FILE_MAP_ALL_ACCESS, // 读写访问权限

0,

0,

1024);

if (pBuf == NULL)

{

printf("Could not map view of file (%d)\n", GetLastError());

CloseHandle(hMapFile);

return 1;

}

// 从共享内存中读取数据

printf("%s\n", pBuf);

// 释放共享内存

UnmapViewOfFile(pBuf);

CloseHandle(hMapFile);

```

首先,我们调用 OpenFileMapping 函数打开共享内存对象。接下来,我们调用 MapViewOfFile 函数将共享内存映射到进程地址空间中。最后,我们读取共享内存中的数据,并通过调用 UnmapViewOfFile 函数和 CloseHandle 函数释放共享内存。

总结

在 Windows 操作系统中,共享内存被广泛应用于各种应用程序中,特别是在多进程或多线程应用程序中。通过使用 CreateFileMapping 和相关的 API 函数,我们可以在程序之间传递数据,而无需复制数据或通过网络传输数据。本文介绍了如何使用 CreateFileMapping 在 Windows 上创建和读取共享内存。

  • 原标题:如何使用createfilemapping在Windows上创建共享内存?

  • 本文链接:https:////zxzx/12241.html

  • 本文由深圳飞扬众网小编,整理排版发布,转载请注明出处。部分文章图片来源于网络,如有侵权,请与飞扬众网联系删除。
  • 微信二维码

    CTAPP999

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

    微信联系

    在线咨询

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


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


    在线咨询

    免费通话


    24h咨询☎️:166-2096-5058


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

    免费通话
    返回顶部