zoukankan      html  css  js  c++  java
  • 使用内存映射文件进行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;
    }
    复制代码

    运行效果图:

  • 相关阅读:
    选择结构
    java交互Scanner类
    生成Javadoc文档
    Java变量命名规范
    java变量类型和常量类型
    Linux命令目录重点
    网络设置
    任务计划
    用户与权限
    yum安装软件
  • 原文地址:https://www.cnblogs.com/ashooter/p/4474425.html
Copyright © 2011-2022 走看看