0

こんにちは、Microsoft のファイル マッピングを使用して、クラスから P1 プロセスのオブジェクトを P2.exe プロセスに共有したいと考えています。 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 は 2 つの文字列をうまく読み取ります。

しかし、1 つの文字 (add.nameWindow = "Windowstest+" サイズが両方とも 28) の場合、それはもう機能しません。これは、サイズまたはメモリ エラーである可能性があります。

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

だから私の質問は:

ファイルまたはバッファのデータ サイズを増やすにはどうすればよいですか? ファイルマッピングでオブジェクトクラスのすべてのメンバーを渡すにはどうすればよいですか (2 つの文字列と HWND hwndWindow; HANDLE histFile; WIN32_FIND_DATA dataFile) 2 つのプロセス間でオブジェクトからのデータを共有する他の方法はありますか。

PS: 多くのフォーラムを読みましたが、答えが見つからないか、理解できません。

全てに感謝。

4

1 に答える 1