Memory Mapped File changes not reflected in underlying file

时间:2018-03-25 18:56:27

标签: c winapi mmf

I am learning MMF in win32 C.

I can't seem to see what I am missing... Here is my code:

#include "stdafx.h"
#include <Windows.h>


int main()
{
    wchar_t szfilename[] = L"c:\\temp\\mmf.txt";


    HANDLE hFile = CreateFile(
    szfilename, 
    GENERIC_READ | GENERIC_WRITE,                           //dwDesiredAccess
    FILE_SHARE_READ | FILE_SHARE_WRITE,                     //dwShareMode
    NULL,                                                   //lpSecurityAttributes
    CREATE_NEW,                                             //dwCreationDisposition
    FILE_ATTRIBUTE_NORMAL,                                  //dwFlagsAndAttributes
    NULL);                                                  //hTemplateFile

if (hFile == INVALID_HANDLE_VALUE)
{
    DWORD error = GetLastError();
    if (error != ERROR_FILE_EXISTS)
        exit(-1);
}

//Now create the file mapping
HANDLE hMap = CreateFileMapping(
    hFile,
    NULL,                   //LPSECURITY_ATTRIBUTES lpAttributes,
    PAGE_READWRITE,         //DWORD flProtect,
    0,                      //DWORD dwMaximumSizeHigh,
    1024,                   //DWORD dwMaximumSizeLow,
    L"myMappingFile");      //LPCTSTR lpName

if (hMap == (HANDLE)ERROR_ALREADY_EXISTS || hMap == NULL)
{
    DWORD error = GetLastError();
    exit(-2);
}


LPCTSTR pBuf = (LPTSTR)MapViewOfFile(hMap,   // handle to map object
    FILE_MAP_ALL_ACCESS, // read/write permission
    0,
    0,
    0);

if (pBuf == NULL)
{
    printf("Could not map view of file (%d).\n",
        GetLastError());
    return -2;
}

wchar_t szMsg[] = L"Msg from first process";
CopyMemory((PVOID)pBuf, szMsg, wcslen(szMsg) * sizeof(wchar_t));

UnmapViewOfFile(pBuf);

CloseHandle(hMap);

CloseHandle(hFile);
return 0;
}

I open a file, associate it with a memory mapping and create a view. Then I write data (copy) into the buffer (view) and close things down.

I am trying to figure out why my underlying file (c:\temp\mmf.txt) does not contain the msg after the routine executes. Am I missing something? The file size remains 0.

1 个答案:

答案 0 :(得分:0)

这是一段代码片段,用于演示文件的内存映射。最后,我认为只需仔细阅读每个API调用的MSDN文档,您就会受益匪浅。

HANDLE  hFile           = INVALID_HANDLE_VALUE;
HANDLE  hFileMapping    = NULL;
LPVOID  pBase       = NULL;

__try
{
    hFile = CreateFile(filename, 
                       GENERIC_READ, 
                       FILE_SHARE_READ, 
                       NULL,
                       OPEN_EXISTING, 
                       FILE_ATTRIBUTE_NORMAL, 
                       0);

    if(hFile == INVALID_HANDLE_VALUE) __leave;

    hFileMapping = CreateFileMapping(hFile, 
                                     NULL, 
                                     PAGE_READONLY, 
                                     0, 0, NULL);
    if(hFileMapping == NULL) __leave;

    pFileBase = MapViewOfFile(hFileMapping, 
                              FILE_MAP_READ, 
                              0, 0, 0);
    if(pBase == NULL) __leave;
}
__finally
{
    if(hFile != INVALID_HANDLE_VALUE) CloseHandle(hFile);
    if(hFileMapping != NULL) CloseHandle(hFileMapping);
}
相关问题