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 回答