使用内存映射文件进行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;
}

运行效果图:

 

 

posted on 2015-05-03 12:33  一直向前的射手2  阅读(261)  评论(0编辑  收藏  举报

导航