想做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-10-15 20:28:41