利用自定义消息(MFC界面)实现进程间通讯

来源:互联网 发布:linux下sleep 的用法 编辑:程序博客网 时间:2024/05/22 13:26

使用了操作系统的消息队列,所以可以做到进程32位,64位通用!但是同样受限于此,只能做到四个字节(或者八个字节)的数字数据通讯!


//server.cpp#include <windows.h>#include "resource.h"INT_PTR CALLBACK DialogProcedure(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);BOOL OnInitDialog(HWND DlgHwnd);#define  UM_IPC WM_USER+1HWND __DlgHwnd = NULL;HWND __EditHwnd = NULL;char __BufferData[4] = { 0 };int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow){//入口函数DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,DialogProcedure);return 0;}INT_PTR CALLBACK DialogProcedure(HWND hwndDlg,UINT uMsg,WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_COMMAND:{switch (LOWORD(wParam)){case IDOK:{GetWindowTextA(__EditHwnd, __BufferData, 5);//从__EditHwnd向__BufferData上最多拷贝5个字节including the null character!ULONG32 ParameterData = 0;ParameterData = atoi(__BufferData);SendMessage(__DlgHwnd, UM_IPC, (WPARAM)ParameterData, NULL);break;}default:break;}break;}case WM_INITDIALOG:{OnInitDialog(hwndDlg);break;}case WM_CLOSE:{EndDialog(hwndDlg, 0);break;}default:break;}return 0;}BOOL OnInitDialog(HWND DlgHwnd){__DlgHwnd = FindWindow(NULL, L"Client");if (__DlgHwnd==NULL){return FALSE;}__EditHwnd = GetDlgItem(DlgHwnd, IDC_EDIT_MAIN);if (__EditHwnd==NULL){return FALSE;}return TRUE;}

//client.cpp#include <windows.h>#include "resource.h"//(能成功是因为server都向Clent只传四个字节)INT_PTR CALLBACK DialogProcedure(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);BOOL OnInitDialog(HWND DlgHwnd);#define UM_IPC WM_USER+1HWND __EditHwnd = NULL;char __BufferData[4] = { 0 };int APIENTRY wWinMain(_In_ HINSTANCE hInstance,_In_opt_ HINSTANCE hPrevInstance,_In_ LPWSTR    lpCmdLine,_In_ int       nCmdShow){DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,DialogProcedure);return 0;}INT_PTR CALLBACK DialogProcedure(HWND hwndDlg,  UINT uMsg,WPARAM wParam, LPARAM lParam){switch (uMsg){case WM_INITDIALOG:{OnInitDialog(hwndDlg);break;}case WM_COMMAND:{switch (LOWORD(wParam)){case IDOK:{int a = 0;break;}default:break;}break;}case WM_CLOSE:{EndDialog(hwndDlg, 0);break;}case UM_IPC:{itoa((int)wParam, __BufferData, 10);SetWindowTextA(__EditHwnd, __BufferData);break;}default:break;}return 0;}BOOL OnInitDialog(HWND DlgHwnd){__EditHwnd = GetDlgItem(DlgHwnd, IDC_EDIT_MAIN);if (__EditHwnd == NULL){return FALSE;}return TRUE;}

注:

1.由于Server中需要使用FindWindow函数来找到Client的窗口,所以需要先启动Client段端程序!

2.本程序只是用了W参传递,只能传递4个字节的数字数据!(支持负数)

3.最后的程序在32位,64位间可以互相通讯!

4.程序使用的界面只是两个editMFC控件,




如果Server传递非数字数据,Client会显示0:这是由于转换函数itoa失败时返回0.

如果Server传递数据多于四个,Client只会显示前四个数据而不会崩溃,这是因为GetWindowTextA函数只会拷贝前四个数据。


阅读全文
0 0