0

我想写入共享内存,然后将内容转储到 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,但它没有效果。我究竟做错了什么?或者有更好的方法吗?

4

4 回答 4

8

在里面

sprintf(MapViewOfFile, "<output 1>"); 

行,你想要lpMapAddress,不是MapViewOfFile。或者(char*)lpMapAddress更准确地说。

于 2009-09-14T18:04:07.570 回答
2

您正在尝试写入常规文件。要写入共享内存,您应该传递INVALID_HANDLE_VALUECreateFileMapping. 查看这篇文章了解更多详情。

   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);
于 2009-09-14T18:04:48.767 回答
0

在 sprintf 中,您传递函数 MapViewOfFile 的地址。相反,您应该传递映射的内存地址。

于 2009-09-14T18:09:32.693 回答
0

回答“有更好的方法吗?”:看看Boost.Interprocess,特别是关于内存映射的部分

于 2009-09-14T18:15:00.493 回答