我想写共享内存,然后将内容转储到win32 api中的文件中。 目前我有这段代码:
HANDLE hFile, hMapFile;
LPVOID lpMapAddress;
hFile = CreateFile("input.map",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
hMapFile = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
TEXT("SharedObject"));
lpMapAddress = MapViewOfFile(hMapFile,
FILE_MAP_ALL_ACCESS,
0,
0,
0);
sprintf(MapViewOfFile, "<output 1>");
UnmapViewOfFile(lpMapAddress);
CloseHandle(hFile);
CloseHandle(hMapFile);
但是,第31行(sprintf调用)给出错误:
error: cannot convert `void*(*)(void*, DWORD, DWORD, DWORD, DWORD)'
to `char*' for argument `1' to `int sprintf(char*, const char*, ...)'
我已经尝试将lpMapAddress转换为LPTSTR,但它没有效果。我究竟做错了什么?或者有更好的方法吗?
答案 0 :(得分:8)
在
中sprintf(MapViewOfFile, "<output 1>");
行,您想要lpMapAddress
,而不是MapViewOfFile
。或者(char*)lpMapAddress
准确无误。
答案 1 :(得分:1)
您正在尝试写入常规文件。要写入共享内存,您应该将INVALID_HANDLE_VALUE
传递给CreateFileMapping
。有关详细信息,请查看this文章。
TCHAR szName[]=TEXT("Global\\MyFileMappingObject");
HANDLE hMapFile;
PVOID pBuf;
const DWORD BUF_SIZE = 256;
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // max. object size
BUF_SIZE, // buffer size
szName); // name of mapping object
pBuf = MapViewOfFile(hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
BUF_SIZE);
TCHAR szMsg[]=TEXT("<output 1>");
CopyMemory(pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
答案 2 :(得分:0)
在sprintf中,您传递的函数MapViewOfFile的地址。相反,您应该传递映射的内存地址。
答案 3 :(得分:0)
回答“有更好的方法吗?”:请特别注意Boost.Interprocess,section on memory mapping。