Общий доступ к данным

Здравствуйте, я хочу поделиться объектом из класса из процесса P1 в процесс P2.exe, используя сопоставление файлов из Microsoft: 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;
}

Поэтому я стараюсь использовать только 2 строки для тестов: add.nameLogFile = «Logfil» и add.nameWindow = «Windowstest»; размер обоих.
Это работает, P2 хорошо читает две строки.

Но когда у меня был один символ (add.nameWindow = «Windowstest +» размером 28 оба), он больше не работал. Это может быть размер или ошибка памяти с этим:

TCHAR szName [] = TEXT («Global \ MyFileMappingObject»);

Итак, мои вопросы:

Как увеличить размер данных файла или буфера?
Как я могу передать все члены моего класса объектов в сопоставление файлов (две строки и HWND hwndWindow; HANDLE histFile; WIN32_FIND_DATA dataFile)
Есть ли другой метод двух общих данных от объекта между двумя процессами.

PS: Я читаю много форумов, и я не нахожу своего ответа или не понимаю.

Спасибо за все.

0

Решение

Это на самом деле не работает.

Когда std::string хранит короткую строку, символы могут храниться внутри std::string объект. Однако, когда строка становится больше, в куче будет выделяться дополнительное пространство — вне string объект.

Это пространство кучи не записывается в файл и больше не работает.

К сожалению, вам придется переосмыслить это с самого начала.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]