【C/C++实现进程间通信 二】消息队列

前情回顾

上一期已经讲解过了进程的相关概念以及进程间通信的实现原理,下面仅展示消息传递机制实现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。

效果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Windows C++ 中,两个进程之间可以使用消息队列来传递消息。以下是简单的步骤: 1. 创建一个消息队列,可以使用函数 `CreateMessageQueue()`。 2. 在发送进程中,使用函数 `SendMessage()` 将消息发送到消息队列中。 3. 在接收进程中,使用函数 `ReceiveMessage()` 从消息队列中接收消息。 具体实现可以参考以下代码示例: 发送进程: ```c++ #include <windows.h> #include <iostream> int main() { // 创建一个消息队列 HANDLE hMsgQueue = CreateMailslot(TEXT("\\\\.\\mailslot\\test_mailslot"), 0, MAILSLOT_WAIT_FOREVER, NULL); if (hMsgQueue == INVALID_HANDLE_VALUE) { std::cout << "CreateMailslot failed with error " << GetLastError() << std::endl; return 1; } // 发送消息到消息队列 std::string message = "Hello from sender!"; if (!SendMessage(hMsgQueue, message.c_str(), message.length(), NULL, NULL)) { std::cout << "SendMessage failed with error " << GetLastError() << std::endl; CloseHandle(hMsgQueue); return 1; } CloseHandle(hMsgQueue); return 0; } ``` 接收进程: ```c++ #include <windows.h> #include <iostream> int main() { // 打开消息队列 HANDLE hMsgQueue = CreateFile(TEXT("\\\\.\\mailslot\\test_mailslot"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); if (hMsgQueue == INVALID_HANDLE_VALUE) { std::cout << "CreateFile failed with error " << GetLastError() << std::endl; return 1; } // 从消息队列中接收消息 char buffer[1024]; DWORD bytesRead; if (!ReadFile(hMsgQueue, buffer, sizeof(buffer), &bytesRead, NULL)) { std::cout << "ReadFile failed with error " << GetLastError() << std::endl; CloseHandle(hMsgQueue); return 1; } std::string message(buffer, bytesRead); std::cout << "Received message: " << message << std::endl; CloseHandle(hMsgQueue); return 0; } ``` 注意,这里使用的是邮槽(Mailslot)来实现消息队列,邮槽是 Windows 中一种用于进程间通信的机制。邮槽是一种命名的管道,它可以用于在本地计算机上发送和接收消息。在这里,我们使用邮槽作为消息队列来传递消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛狂的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值