Annuaire d'articles
Bilan de la situation antérieure
Le numéro précédent a expliqué le concept de processus et le principe de mise en œuvre de la communication inter-processus.Ce qui suit montre uniquement le code pertinent du mécanisme de transmission de messages pour réaliser 1 communication inter-processus.
fil de pensée
/*
本项目主要用于以消息传递机制的方式进行进程间通信的测试。
1.主要包含PublisherDemo和SubscriberDemo两个子项目,分别用于发送信息和接收信息。
2.在PublisherDemo中,程序通过FindWindow函数查找进程2创建的窗口句柄,并将消息发送到窗口中。
消息的数据部分是一个字符串
3.在SubscriberDemo中,程序首先注册一个窗口类,并创建一个窗口。在窗口过程函数WndProc中,通
过捕获WM_COPYDATA消息来接收消息,判断消息类型后打印消息内容。
*/
code source
Environnement : Windows 64 bits + QtCreator
implique certaines fonctions de WINAPI. Pour une analyse spécifique des fonctions, veuillez vous référer au document officiel de WINAPI.
Éditeur.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;
}
Abonné.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;
}
Remarque : La séquence d'exécution des programmes ci-dessus doit être la suivante : démarrez d'abord Subscriber.exe, puis démarrez Publisher.exe.