2009-09-14 36 views
0

我想写入共享内存,然后将内容转储到win32 API中的文件。 目前我有这样的代码:如何使用C++写入共享内存?

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,但它没有任何效果。我究竟做错了什么?还是有更好的方法来做到这一点?

回答

8

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

线,你想lpMapAddress,不MapViewOfFile。或者(char*)lpMapAddress准确。

+0

现在我觉得很蠢:) – pypmannetjies 2009-09-14 18:18:24

1

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

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