【问题标题】:Memory Mapped File changes not reflected in underlying file内存映射文件更改未反映在基础文件中
【发布时间】:2018-03-25 18:56:26
【问题描述】:

我正在用win32 C学习MMF。

我似乎看不到我错过了什么...... 这是我的代码:

#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;
}

我打开一个文件,将它与内存映射关联并创建一个视图。然后我将数据(副本)写入缓冲区(视图)并关闭。

我试图弄清楚为什么我的基础文件 (c:\temp\mmf.txt) 在例程执行后不包含味精。我错过了什么吗?文件大小保持为 0。

【问题讨论】:

  • hMap == (HANDLE)ERROR_ALREADY_EXISTS - 真的吗?
  • 我认为您不想继续使用hFile == INVALID_HANDLE_VALUE。那是映射系统页面文件的一部分。也许您想要始终创建或始终打开的处置,如果文件已经存在,则成功。

标签: c winapi mmf


【解决方案1】:

这是一段演示内存映射文件的代码。最后,我认为您将受益于阅读 MSDN 文档,了解您正在使用的每个 API 调用更加仔细。

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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2012-08-24
    • 2012-02-08
    • 2016-10-13
    • 1970-01-01
    • 2010-11-01
    • 2011-05-14
    相关资源
    最近更新 更多