标签:
想做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;
}
运行效果图:

标签:
原文地址:http://www.cnblogs.com/ashooter/p/4474425.html