共享数据文件映射
Shared data Filemapping
你好,我想使用microsoft的文件映射将P1进程的类中的对象共享到P2.exe进程:https://msdn.microsoft.com/fr-fr/library/windows/desktop/aa366537(v=vs.85).aspx.
P1写入数据,P2读取数据。我想分享所有的数据,但不起作用。
P1:
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <iostream>
#include <string>
using namespace std;
TCHAR szName[] = TEXT("Global\MyFileMappingObject");
class Object
{
public:
string nameWindow;
string nameLogFile;
HWND hwndWindow;
HANDLE histFile;
WIN32_FIND_DATA dataFile;
};// members to read
int _tmain()
{
Object add;
HANDLE hMapFile;
add.nameLogFile= "Logfil";
add.nameWindow = "Windowstest";
Table *bufData;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
sizeof(Table), // maximum object size (low-order DWORD)
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).n"),
GetLastError());
return false;
}
bufData = (Object*)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(Table));
if (bufData == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).n"),
GetLastError());
CloseHandle(hMapFile);
return false;
}
CopyMemory((PVOID)bufData, &add, sizeof(Table));
cout << "Mise en memoire " << endl;
_getch();
UnmapViewOfFile(bufData);
CloseHandle(hMapFile);
}
P2:
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>
#include <string>
using namespace std;
#pragma comment(lib, "user32.lib")
class Object
{
public:
string nameWindow;
string nameLogFile;
HWND hwndWindow;
HANDLE histFile;
WIN32_FIND_DATA dataFile;
};// members to write
TCHAR szName[] = TEXT("Global\MyFileMappingObject");
int _tmain()
{
HANDLE hMapFile;
LPCTSTR pBuf;
Table *bufData=new Table;
hMapFile = OpenFileMapping(
FILE_MAP_ALL_ACCESS, // read/write access
FALSE, // do not inherit the name
szName); // name of mapping object
if (hMapFile == NULL)
{
_tprintf(TEXT("Could not open file mapping object (%d).n"),
GetLastError());
return 1;
}
bufData = (Object*)MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
sizeof(Object));
if (bufData == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).n"),
GetLastError());
CloseHandle(hMapFile);
return 1;
}
cout << "DATA" << endl;
cout << "Log:" << bufData->nameLogFile<<endl;
cout << "Window:" << bufData->nameWindow << endl;
UnmapViewOfFile(bufData);
CloseHandle(hMapFile);
system("pause");
return 0;
}
因此,我尝试只使用两个字符串进行测试:add.nameLogFile="Logfil"和add.nameWindow="Windowstest";两者的大小。P2能很好地读取两个字符串。
但当我有一个字符时(add.nameWindow="Windowstest+"大小为28,两者都有),它就不起作用了。这可能是大小或内存错误:
TCHAR szName[]=TEXT("Global\MyFileMappingObject");
所以我的问题是:
如何增加文件或缓冲区的数据大小?如何在文件映射中传递对象类的所有成员(两个字符串和HWND hwndWindow;HANDLE histFile;WIN32_IND_DATA数据文件)两个进程之间是否有其他方法两个共享对象中的数据。
附言:我看了很多论坛,我没有找到我的答案或不理解。
谢谢大家。
这真的不起作用。
当std::string
存储短字符串时,字符可能存储在std::string
对象内部。但是,当字符串变大时,将在堆上分配string
对象之外的额外空间。
这个堆空间没有写入到文件中,然后它就不再工作了。
不幸的是,你必须从一开始就重新思考这个问题。
相关文章:
- C/C++ - 查询平台相关的换行符(用于内存映射文件)
- 写入映射文件
- 内存映射文件访问非常慢
- 我正在尝试创建一个C++映射,该映射在boost内存映射文件中具有向量值
- 无法从地址打开映射文件
- 为什么 du -sh 输出错误大小的内存映射文件
- 使用 mmap 映射文件中的不同段
- Growing Boost.使用单个写入器的进程间内存映射文件
- 调整窗口内存映射文件的大小,而不会使指针失效
- 映射文件中成员结构的地址
- 与从C++到C#的内存映射文件共享链式结构
- 在 C++ 和 C# 之间共享内存映射文件结构
- 如何使用 Boost 的"mapped_file_sink"类刷新内存映射文件?
- 使用Solaris 64位或Linux 32位到Linux 64位的内存映射文件
- 循环访问提升mapped_region/内存映射文件
- 使用 Win32/WINAPI 通过内存映射文件传输数据
- qtCreator 错误:无法映射文件,errno=22 文件用于架构x86_64?
- 复制存储在内存映射文件中的数组的一部分
- 用于读取输入文件的内存映射文件的安全
- 写入和读取映射文件C++