我正在尝试让我的软件通过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,任何帮助都会受到赞赏,谢谢。
答案 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);