使用Memory Mapping,c ++,ERROR_NOT_ENOUGH_MEMORY共享结构

时间:2012-06-18 14:16:29

标签: c++ struct shared-memory

我正在尝试让我的软件通过Memory Mapping与现有的第三方软件进行通信。我被告知要将一个结构写入一个由另一个软件创建的内存映射文件。我设法打开文件,它肯定正确创建,但我在尝试映射文件时收到错误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,任何帮助都会受到赞赏,谢谢。

1 个答案:

答案 0 :(得分: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);