文章目录
- 前情回顾
 - 思路
 - 源码
 - Publisher.cpp
 - Subscriber.cpp
 
- 效果
 
前情回顾
上一期已经讲解过了进程的相关概念以及进程间通信的实现原理,下面仅展示消息传递机制实现1进程间通信的相关代码。
思路
/*
    本项目主要用于以消息传递机制的方式进行进程间通信的测试。
    1.主要包含PublisherDemo和SubscriberDemo两个子项目,分别用于发送信息和接收信息。
    2.在PublisherDemo中,程序通过FindWindow函数查找进程2创建的窗口句柄,并将消息发送到窗口中。
    消息的数据部分是一个字符串
    3.在SubscriberDemo中,程序首先注册一个窗口类,并创建一个窗口。在窗口过程函数WndProc中,通
    过捕获WM_COPYDATA消息来接收消息,判断消息类型后打印消息内容。
*/
 
源码
环境:Windows 64位 + QtCreator
 涉及到一些WINAPI中的函数,具体函数解析可自行参考WINAPI官方文档
Publisher.cpp
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
#pragma comment  (lib, "User32.lib")//链接到User32.lib
using namespace  std;
int main() {
    HWND hWnd = FindWindow(NULL, L"ReceiverWindow");
    if (hWnd == NULL) {
        std::cout << "Error: Receiver window not found!" << std::endl;
        return 1;
    }
    COPYDATASTRUCT cds;
    cds.dwData = 0; // 消息类型
    cds.cbData = sizeof("Hello, Subscriber!"); // 消息数据的大小
    cds.lpData = (PVOID)"Hello, Subscriber!"; // 消息数据
    while(true)
    {
        SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);
        cout<<"Send message : Hello, Subscriber!"<<endl;
        Sleep(1000);//1s发送一次消息
    }
    return 0;
}
 
Subscriber.cpp
#include <stdio.h>
#include <iostream>
#include <Windows.h>
#include <WinUser.h>
#pragma comment (lib,"User32.lib")//链接到User32.lib
LRESULT CALLBACK WndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {
    if (msg == WM_COPYDATA) {
        COPYDATASTRUCT* pCds = (COPYDATASTRUCT*)lParam;
        if (pCds->dwData == 0) { // 消息类型判断
            std::cout << "Received message: " << (char*)pCds->lpData << std::endl;
        }
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
int main() {
    // 注册窗口类
    WNDCLASS wc = {0};
    wc.lpfnWndProc = WndProc;
    wc.hInstance = GetModuleHandle(NULL);
    wc.lpszClassName = L"ReceiverWindow";
    if (!RegisterClass(&wc)) {
        std::cout << "Error: Failed to register window class!" << std::endl;
        return 1;
    }
    // 创建窗口
    HWND hWnd = CreateWindow(
        L"ReceiverWindow",
        L"ReceiverWindow",
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        NULL,
        NULL,
        GetModuleHandle(NULL),
        NULL
    );
    if (hWnd == NULL) {
        std::cout << "Error: Failed to create window!" << std::endl;
        return 1;
    }
    // 消息循环
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    getchar();
    return 0;
}
 
注:以上程序运行顺序应该为:先启动Subscriber.exe,再启动Publisher.exe。
效果




















