Qt中IPC(进程间通信)的方式一:WM_COPYDATA消息

本文详细介绍了在Qt中如何利用WM_COPYDATA消息进行进程间通信。首先,解释了SendMessage和PostMessage的区别,然后阐述了Qt中处理自定义消息的两种方式:nativeEventFilter和nativeEvent。接着,通过分析Qt的源代码,展示了Qt如何接收并处理来自SendMessage的消息。最后,提到了一个Qt IPC的Demo,并预告了下一篇文章将讨论共享内存的通信方式。
摘要由CSDN通过智能技术生成

1. 发送消息:SendMessage(WinAPI)

WINUSERAPI
LRESULT 
WINAPI
SendMessageA(
__in HWND hWnd,
__in UINT Msg,
__in WPARAM wParam,
__in LPARAM lParam);
WINUSERAPI
LRESULT    // 返回值,长整形
WINAPI
SendMessageW(
__in HWND hWnd, //接受消息的进程的句柄
__in UINT Msg, // 消息类型,如WM_COPYDATA、WM_USER
__in WPARAM wParam, // 下面讲
__in LPARAM lParam); // 下面讲
#ifdef UNICODE
#define SendMessage SendMessageW
#else
#define SendMessage SendMessageA
#endif // !UNICODE

在Windows的消息函数中,有两个非常熟悉的参数:wParam,lParam。这两个参数的字面意义对于现在的程序来说已经不重要了,因为它是16位系统的产物,为了保持程序的可移植性,就将它保存了下来。它的字面意义,w表示word,l表示long,对于32为系统来说,分别是无符号整数(unsigned int)和长整型(long),都是32位整数。所以,根据具体的消息解析参数即可,不用在乎其字面意义了。

//下面是Windows的定义/* Types use for passing & returning polymorphic values */
typedef UINT_PTR            WPARAM;
typedef LONG_PTR            LPARAM;

//下面是32位程序的宏定义
typedef _W64 unsigned int UINT_PTR, *PUINT_PTR;
typedef _W64 long LONG_PTR, *PLONG_PTR;

    提到SendMessage就不得不提一下PostMessage,同样是发消息,那两者有什么区别呢?

最大的区别就是SendMessage是同步的,会把消息发送到应用程序消息队列中并等待其处理完返回,而PostMessage是异步的,将消息发出去后就不管了,继续下面的代码,故消息存在没处理或丢失的风险。

2. Qt中处理自定义消息:(前提是开启了事件循环QEventLoop)

方式一:nativeEventFilter

使用installNativeEventFilter注册自定义事件过滤器,继承QAbstractNativeEventFilter实现nativeEventFilter方法以实现自定义事件过滤器。

看下两个方法的定义:

//QCoreApplicati
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值