使用内存映射文件进行EXE、DLL通信(非MFC)

想做EXE、DLL通信,网上说的比较多的是WM_COPYDATA消息,发现需要在添加消息映射比较麻烦,而且网上几乎都是MFC的代码,想用的是控制台代码。

就想到了用内存映射文件。EXE发数据给DLL。

EXE的代码:

/***************************************************************************************
* 文件名: test.cpp
* 功  能: 利用内存映射文件进行EXE、DLL通信
****************************************************************************************/
#include "stdafx.h"
#include <stdlib.h>
#include <afxwin.h>

int _tmain(int argc, _TCHAR* argv[])
{
    // 1. 创建命名的文件映射
    HANDLE hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
        0, 16, L"File_Mapping_Test");
    if (NULL == hMapFile || INVALID_HANDLE_VALUE == hMapFile)
    {
        return FALSE;
    }

    // 2. 创建View
    PVOID pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 16);
    if (NULL == pBuf)
    {
        return FALSE;
    }

    // 3. 将共享数据复制到文件映射中
    wcscpy_s((PWCHAR)pBuf, 16, L"aheadshooter");

    // 4. 加载DLL
    LoadLibrary(L"testDll");

    // 5. 等待结束
    getchar();

    // 6. 取消Mapping, 关闭句柄
    UnmapViewOfFile(pBuf);
    CloseHandle(hMapFile);

    return 0;
}

DLL代码:

/***************************************************************************************
* 文件名: dllmain.cpp
* 功  能: 利用内存映射文件进行EXE、DLL通信
****************************************************************************************/
#include "stdafx.h"
#include <stdio.h>

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        {
            // 1. 打开文件Mapping
            HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, L"File_Mapping_Test");
            if (NULL == hMapFile)
            {
                return FALSE;
            }

            // 2. 创建View
            PVOID pBuf = MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 16);
            if (NULL == pBuf)
            {
                return FALSE;
            }

            // 3. 显示共享数据
            MessageBox(NULL, (LPCWSTR)pBuf, L"EXE传递过来的数据为:", MB_OK);

            // 4. 取消Mapping, 关闭句柄
            UnmapViewOfFile(pBuf);
            CloseHandle(hMapFile);
        }
        break;
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

运行效果图:

时间: 2024-08-09 10:44:20

使用内存映射文件进行EXE、DLL通信(非MFC)的相关文章

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转

原文:C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存

C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped

节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). 内存映射文件对于托管世界的开发人员来说似乎很陌生,但它确实已经是很远古的技术了,而且在操作系统中地位相当.实际上,任何想要共享数据的通信模型都会在幕后使用它. 内存映射文件究竟是个什么?内存映射文件允许你保留一块地址空间,然后将该物理存储映射到这块内存空间中进行操作.物理存储是文件管理,而内存映射文件是操作系统级内存管理. 优势:     1.访问磁盘文件上的数据不需执行I/O操作和缓存

内存映射文件

一段内存地址空间,映射着物理存储器上一个已经存在于磁盘上的文件.在对该文件进行操作之前必须首先对文件进行映射.使用内存映射文件处理存储于磁盘上的文件时,将不必再对文件执行I/O操作. 内存映射文件,是由一个文件到一块内存的映射.Win32提供了允许应用程序把文件映射到一个进程的函数 (CreateFileMapping). API: HANDLE CreateFileMapping(HANDLE hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttribute

【WIN32进阶之路】:内存映射文件

第一章:源起  遇到一个问题,如果一个客户数据文件有2g大,客户要通过界面查询文件中的数据并用列表控件显示数据,要怎么处理这个文件才能让应用程序不会长时间无响应,客户感觉不到程序的卡顿? 第二章:解决之道 第一反应是用内存映射文件处理大文件,将文件分成数次映射至内存地址空间,避免一次性缓冲整个文件带来的界面长时间无响应,并将暂时不用的内存映射文件取消映射,客户是用列表控件进行显示,那就可以在首次加载的时候只加载第一页的内容就进行显示,之后在缓冲下一页的内容,当用户查看中间页面的内容时可以缓冲将当

关于内存映射文件记录

预期目的: 进程A exe 当进程B打开某窗口挂载线程钩子DLL,监听鼠标消息.想在挂载钩子的时候申请内存 嵌套结构体如下: typedef struct strTmpGroup { strTmpGroup() { pList = NULL; } CString strTmpGroupName; CListUIEx* pList; TmpLinkMan_t strTmpLinkList; }strTmpGroup; typedef std::list<strTmpGroup> strTmpGr

NET 4 中 内存映射文件

原文链接 : http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx 预备知识 : 本文需要你对 OS 内存管理有一定了解. 我想探索下即将到来的 .NET 4 中一些与众不同的新特性,而不是已被大众所熟知的动态类型.协变与逆变等特性.出于对性能增强的喜爱,接下来俺将发表几篇新特性的博文. 内存映射文件对于托管世界的开发人员来说,似乎就像是火星人一样陌生

计算机程序的思维逻辑 (61) - 内存映射文件及其应用 - 实现一个简单的消息队列

本节介绍内存映射文件,内存映射文件不是Java引入的概念,而是操作系统提供的一种功能,大部分操作系统都支持. 我们先来介绍内存映射文件的基本概念,它是什么,能解决什么问题,然后我们介绍如何在Java中使用,我们会设计和实现一个简单的.持久化的.跨程序的消息队列来演示内存映射文件的应用. 基本概念 所谓内存映射文件,就是将文件映射到内存,文件对应于内存中的一个字节数组,对文件的操作变为对这个字节数组的操作,而字节数组的操作直接映射到文件上.这种映射可以是映射文件全部区域,也可以是只映射一部分区域.

【JavaNIO的深入研究4】内存映射文件I/O

内存映射文件能让你创建和修改那些因为太大而无法放入内存的文件.有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问.这种解决办法能大大简化修改文件的代码.fileChannel.map(FileChannel.MapMode mode, long position, long size)将此通道的文件区域直接映射到内存中.注意,你必须指明,它是从文件的哪个位置开始映射的,映射的范围又有多大:也就是说,它还可以映射一个大文件的某个小片断. MappedByteB

内存映射文件 修改以及保存文件

/**************************************************************** // Function : 内存映射文件进行文件同步操作的例子,转载请注明出处 // Author : Lthis // Create : 2015-2-1 11:07:50 // Checked : Lthis 2015-2-1 ****************************************************************/ #i