1

ソフトウェアがメモリ マッピングを介して既存のサードパーティ ソフトウェアと通信できるようにしようとしています。他のソフトウェアによって作成されるメモリ マップ ファイルに構造体を書き込むように言われました。ファイルを開くことができ、正しく作成されていることは間違いありませんが、ファイルをマップしようとするとエラー 8 (ERROR_NOT_ENOUGH_MEMORY) が発生します。

#include "stdafx.h"
#include <Windows.h>

struct MMFSTRUCT
{
    unsigned char flags;
    DWORD   packetTime;
    float   telemetryMatrix[16];
    float   velocity[3];
    float   accel[3];
};

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD Time = 0;
    HANDLE hMapFile;
    void* pBuf;
    TCHAR szName[]=TEXT("$FILE$");

    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;
    }
    while(true)
    {
        pBuf = MapViewOfFile(hMapFile,   // handle to map object
                            FILE_MAP_WRITE, // read/write permission
                            0,
                            0,
                            0);
        if (pBuf == NULL)
        {
            _tprintf(TEXT("Could not map view of file (%d).\n"),
                   GetLastError());
            CloseHandle(hMapFile);
            return 1;
        }
        MMFSTRUCT test_data;
        // define variables here
        CopyMemory(pBuf, &test_data,  sizeof(MMFSTRUCT));
    }
    // etc
    return 0;
}

MSDN は、共有メモリを作成したプログラムによって共有メモリが拡張するように設定されていない場合にこれが発生する可能性があり、これらの関数を使用してポインター サイズを設定する必要があると述べています。

SetFilePointer(hMapFile, sizeof(MMFSTRUCT) , NULL, FILE_CURRENT);
SetEndOfFile(hMapFile);

しかし、私はまだエラー 8 を受け取っています。

4

1 に答える 1

1

ループ内の MapViewOfFile はほとんど意味がないと思います。それはタイプミスでしょうか?それとは別に、ファイルはおそらく空であるため、マップされたメモリのサイズを MapViewOfFile に渡す必要があります。

if (hMapFile == NULL)
{
    _tprintf(TEXT("Could not open file mapping object (%d).\n"),
           GetLastError());
    return 1;
}

pBuf = MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_WRITE, // read/write permission
                        0,
                        0,
                        sizeof(MMFSTRUCT));
if (pBuf == NULL)
{
        _tprintf(TEXT("Could not map view of file (%d).\n"),
               GetLastError());
        CloseHandle(hMapFile);
        return 1;
 }
 MMFSTRUCT test_data;
 // define variables here
 CopyMemory(pBuf, &test_data,  sizeof(MMFSTRUCT));

 UnmapViewOfFile(pBuf);
 CloseHandle(hMapFile);
于 2012-06-18T19:04:17.387 に答える