c - 内存映射文件更改未反射(reflect)在基础文件中

标签 c winapi mmf

我正在 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;
}

我打开一个文件,将其与内存映射相关联并创建一个 View 。然后我将数据(复制)写入缓冲区( View )并关闭。

我想弄清楚为什么我的基础文件 (c:\temp\mmf.txt) 在例程执行后不包含 msg。我错过了什么吗?文件大小保持为 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);
}

关于c - 内存映射文件更改未反射(reflect)在基础文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49479695/

相关文章:

c++ - Qt grabWindow 坐标从 GetCursorPos 和 GetWindowRect 转移

winapi - 如何判断字体是否是符号字体?

C#内存映射文件不占用物理内存空间

c - 当您在 C 语言中声明参数数量错误的回调时会发生什么?

objective-c - ARC, block 和 C 回调之间

c - 如何使用 fread 和 fwrite 从文件中读取 pcm 样本?

c - VS 2017 与 AutoCAD 2019 中的 TCHAR 变量截断

c++ - 在屏幕上快速绘制像素