【问题标题】:How do I write to shared memory in C++?如何在 C++ 中写入共享内存?
【发布时间】:2010-11-28 05:24:26
【问题描述】:

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

【问题讨论】:

    标签: c++ winapi shared-memory


    【解决方案1】:

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

    行,你想要lpMapAddress,而不是MapViewOfFile。确切地说是(char*)lpMapAddress

    【讨论】:

      【解决方案2】:

      您正在尝试写入常规文件。要写入共享内存,您应该将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);
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

          回答“有没有更好的方法?”:看看Boost.Interprocess,尤其是section on memory mapping

          【讨论】:

            猜你喜欢
            • 2010-11-28
            • 1970-01-01
            • 1970-01-01
            • 2021-10-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多