中两个进程之间的共享映射内存在编辑时不会更新 我在Windows上使用C++,并在两个进程之间进行简单的通信
第一个进程创建映射内存,在其中写入第一条消息,并复制未命名映射内存的另一个进程的句柄 代码如下所示:中两个进程之间的共享映射内存在编辑时不会更新 我在Windows上使用C++,并在两个进程之间进行简单的通信,c++,winapi,ipc,memory-mapped-files,C++,Winapi,Ipc,Memory Mapped Files,第一个进程创建映射内存,在其中写入第一条消息,并复制未命名映射内存的另一个进程的句柄 代码如下所示: hMapped = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 1000, "my_shared_memory"); if (!hMapped) { cout << "[!] failed to create the shared mapped memory with error : " <
hMapped = CreateFileMappingA(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, 1000, "my_shared_memory");
if (!hMapped)
{
cout << "[!] failed to create the shared mapped memory with error : " << GetLastError() << endl;
getchar();
}
char *shared_buffer = (char*)MapViewOfFile(hMapped, FILE_MAP_ALL_ACCESS, 0, 0, mapped_memory_size);
下面是一个命名共享内存应用程序的示例,它似乎与Visual Studio 2015配合使用。根据指定的命令行参数,应用程序可以作为内存区域的写入程序运行,也可以作为内存区域的读取器运行 查看Microsoft的文档,共享句柄似乎需要进程分叉。从你原来的帖子和问题来看,这似乎不是你在做的事情 多个进程可以通过使用 单个共享文件映射对象或创建单独的文件映射 由同一文件支持的对象。可以创建单个文件映射对象 通过继承进程上的句柄由多个进程共享 创建、复制句柄或打开文件映射对象 按姓名有关详细信息,请参见CreateProcess,DuplicateHandle 和OpenFileMapping函数 在下面使用命名共享内存区域的示例中,我从示例的源代码开始,但是由于懒惰,我只创建了一个源文件,即Windows控制台应用程序,可以作为两个具有不同行为的不同进程启动 用于以两种不同方式执行的源代码文件:
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#define BUF_SIZE 256
TCHAR szName[] = TEXT("MyFileMappingObject");
int main(int argc, char **argv)
{
HANDLE hMapFile;
LPCTSTR pBuf;
int iInstance = 0;
TCHAR szMsgFmt[] = TEXT("Message from first process %d.");
if (argc > 1) {
iInstance = atoi(argv[1]);
}
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
DWORD lastError = GetLastError();
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
std::cin.get();
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
std::cin.get();
return 1;
}
for (int i = 1; i < 4; i++) {
if (iInstance > 0) {
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
}
else {
TCHAR szMsg[128] = { 0 };
wsprintf (szMsg, szMsgFmt, i);
std::cout << "Copying text into shared memory " << i << std::endl;
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
std::cout << "Waiting " << std::endl;
_getch();
}
}
CloseHandle(hMapFile);
UnmapViewOfFile(pBuf);
return 0;
}
及
以及修改后的stdafx.h include文件
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <Windows.h>
#include <WinUser.h>
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here
编译应用程序源文件,然后运行第一个bat文件,该文件将启动并将一些文本放入共享内存区域,然后等待。接下来运行第二个bat文件,该文件将从共享内存区域读取文本
我看到的是,如果您单击第二个bat文件中显示的对话框上的Ok按钮,您将再次看到相同的消息
但是,如果随后转到第一个bat文件的窗口并按enter键生成下一条消息,然后返回第二个bat文件生成的对话框,您将看到它将读取更新的字符串
这都是使用命名的共享文件。未尝试使用共享内存句柄。注释已存档。
#include "stdafx.h"
#include <conio.h>
#include <iostream>
#define BUF_SIZE 256
TCHAR szName[] = TEXT("MyFileMappingObject");
int main(int argc, char **argv)
{
HANDLE hMapFile;
LPCTSTR pBuf;
int iInstance = 0;
TCHAR szMsgFmt[] = TEXT("Message from first process %d.");
if (argc > 1) {
iInstance = atoi(argv[1]);
}
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
BUF_SIZE, // maximum object size (low-order DWORD)
szName); // name of mapping object
DWORD lastError = GetLastError();
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
std::cin.get();
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
if (pBuf == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());
CloseHandle(hMapFile);
std::cin.get();
return 1;
}
for (int i = 1; i < 4; i++) {
if (iInstance > 0) {
MessageBox(NULL, pBuf, TEXT("Process2"), MB_OK);
}
else {
TCHAR szMsg[128] = { 0 };
wsprintf (szMsg, szMsgFmt, i);
std::cout << "Copying text into shared memory " << i << std::endl;
CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
std::cout << "Waiting " << std::endl;
_getch();
}
}
CloseHandle(hMapFile);
UnmapViewOfFile(pBuf);
return 0;
}
shared_mem
pause
shared_mem 1
pause
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//
#pragma once
#include "targetver.h"
#include <Windows.h>
#include <WinUser.h>
#include <stdio.h>
#include <tchar.h>
// TODO: reference additional headers your program requires here