我们总是会选择不同的方案来实现IPC,本地SOCK通讯决然是最好的选择,但往往
敏捷实现一套安全的IPC通讯设计又是那么的吃力。而此时我们在确定系统平台的
同时,能够吸纳现存的东西使自身的困难的变的简单,使有限的时间变的有意义。
-----------------------通过windows消息发送数据-------------------------
检索黏贴,来自windows核心编程:
对于系统已经知道的消息,发送消息时都可以按相应的方式来处理。如果你要建立
自己的(WM_USER+x)消息,并从一个进程向另一个进程的窗口发送,那又
会怎么样?系统不知道你要用内存映像文件并在发送消息时改变指针。为此,微软
建立了一个特殊的窗口消息,WM_COPYDATA以解决这个问题:
COPYDATASTRUCTcds;
SendMessage(hwndReceiver,WM_COPYDATA,
(WPARAM)hwndSender,(LPARAM)&cds);
COPYDATASTRUCT是一个结构,定义在WinUser.h文件中,形式如
下面的样子:
typedefstructtagCOPYDATASTRUCT
{
ULONG_PTRdwData;
DWORDcbData;
PVOIDlpData;
}COPYDATASTRUCT;
当一个进程要向另一个进程的窗口发送一些数据时,必须先初始化COPYDATASTRUCT结构
数据成员dwData是一个备用的数据项,可以存放任何值。例如,你有可能向另外的进程
发送不同类型或不同类别的数据。可以用这个数据来指出要发送数据的内容。
cbData数据成员规定了向另外的进程发送的字节数,lpData数据成员指向要
发送的第一个字节。lpData所指向的地址,当然在发送进程的地址空间中。
当SendMessage看到要发送一个WM_COPYDATA消息时,它建立一个内存
映像文件,大小是cbData字节,并从发送进程的地址空间中向这个内存映像文件中复
制数据。然后再向目的窗口发送消息。在接收消息的窗口过程处理这个消息时,lParam
参数指向已在接收进程地址空间的一个COPYDATASTRUCT结构。这个结构的lpData
成员指向接收进程地址空间中的共享内存映像文件的视图。
关于WM_COPYDATA消息,应该注意三个重要问题:
*只能发送这个消息,不能登记这个消息。不能登记一个WM_COPYDATA消息,因为在接
收消息的窗口过程处理完消息之后,系统必须释放内存映像文件。如果登记这个消息,
系统不知道这个消息何时被处理,所以也不能释放复制的内存块。
*系统从另外的进程的地址空间中复制数据要花费一些时间。所以不应该让发送程序中
运行的其他线程修改这个内存块,直到SendMessage调用返回。
利用WM_COPYDATA消息,可以实现16位和32位之间的通信。它也能实现32位与64位之间的
通信。这是使新程序同旧程序交流的便捷方法。注意在Windows2000和Windows98上完全
支持WM_COPYDATA。但如果你依然在编写16位Windows程序,MicrosofeVisualC++1.52没
有WM_COPYDATA消息的定义,也没有COPYDATASTRUCT结构的定义。需要手工添加这些代码:
//Manually include this in your 16-bit Windows sourcecode.
#defineWM_COPYDATA0x004A
typedefVOIDFAR*PVOID;
typedefstructtagCOPYDATASTRUCT
{
DWORDdwData;
DWORDcbData;
PVOIDlpData;
}COPYDATASTRUCT,FAR*PCOPYDATASTRUCT;
比如,一段用windows窗口发消息到skype的应用代码:
BOOL CHwSkype::SendMsg ( LPCTSTR lpszMsg, ... )
{
if ( !lpszMsg || strlen(lpszMsg) < 1 ) return FALSE;
if ( !InitIsOK() ) return FALSE;
COPYDATASTRUCT CopyData = {0};
char buf[1024] = {0};
va_list va;
va_start ( va, lpszMsg );
_vsnprintf ( buf, sizeof(buf) - 1, (char*)lpszMsg, va);
va_end(va);
CopyData.dwData = 0;
CopyData.lpData = (PVOID)buf;
CopyData.cbData = strlen(buf)+1;
if ( SendMessage ( m_hWnd_Skype, WM_COPYDATA, WPARAM(m_hWnd_MainWindow),
LPARAM(&CopyData)) == 0 )
{
Log ( "Send message [%s] failed", lpszMsg );
return FALSE;
}
return TRUE;
}
windows编程虽古老而耐用,东西学不完,只取其一斑!
分享到:
相关推荐
尽管上述方法在紧急情况下提供了一种有效的解决方案,但随着微软不断更新系统补丁,这种技巧可能在未来被封堵。因此,建立备用管理员账户或使用密码恢复盘作为预防措施仍被强烈推荐。此外,定期更改密码、备份重要...
描述提到了一种解决方案,即利用VBScript(Visual Basic Script)编写一个简单程序,然后结合Windows的组策略编辑器来实现这个功能。 首先,我们要了解VBScript的基本用法。VBScript是一种轻量级的脚本语言,常用于...
然而,即便芍药的美丽可与莲花、牡丹媲美,它却很少被人提及,像许多美好的事物一样,最终被遗忘在了时间的长河中。这里,作者借助“被遗忘的芍药”这一形象,揭示了一个深刻的道理:生活中的美好往往被人们忽视,...
前端内存泄漏及解决方案详解 在前端开发中,内存泄漏是一个非常重要的主题。内存泄漏是指系统进程不再使用的内存没有及时释放,导致内存占用越来越高,轻则影响系统性能,重则导致进程崩溃。在本文中,我们将讨论...
基于FIDO技术的解决方案可以显著提升安全性,防止中间人攻击、重放攻击和假冒设备攻击。同时,由于FIDO认证不依赖于中央认证服务器,减少了单点故障的风险,增强了系统的整体安全性。 文章可能涵盖了以下几个方面:...
### SSO单点登录解决方案详解 #### 一、单点登录概述 单点登录(Single Sign-On,简称SSO)是一种先进的解决方案,旨在通过让用户仅需登录一次即可访问所有相互信任的应用系统,从而提高用户体验并简化安全管理。...
德国心理学家赫尔曼·艾宾浩斯通过实验发现,信息在初次学习后会随着时间的推移而逐渐减少,这种现象被称为“遗忘”。他用一种定量的方式来描述这一过程,即艾宾浩斯遗忘曲线。 遗忘曲线表明,记忆的衰退并不是匀速...
基于人脸识别的火车站监控解决方案 基于人脸识别的火车站监控解决方案是为了建设平安城市,实现城市安防系统的智能监控。该解决方案通过生物特征识别技术,特别是人脸识别技术,将人体生物特征与监控系统结合,实现...
因此,“被遗忘权”作为一项新兴的法律概念,指的是个人有权要求数据控制者删除关于其个人的某些信息的权利,尤其是那些不准确、过时或与原先目的无关的数据。该权利的提出,正是为了应对数字时代中个人隐私权和信息...
### Kindle4&&Touch完全修复解决方案:深度解析与实践指南 #### Kindle4与KindleTouch:对比与特性 Kindle4和KindleTouch作为亚马逊推出的电子书阅读器,各自具有独特的特性和目标用户群体。Kindle4,一款非触摸屏...
本文将深入探讨这一概念,以及它在大数据背景下所面临的挑战和可能的解决方案。 首先,我们需要理解大数据的核心特征。大数据涉及大量、快速和多样化的信息资源,它们通过高级分析技术揭示出隐藏的模式、趋势和关联...
然而,艾宾浩斯遗忘曲线是基于群体平均数据得出的普遍规律,并非适用于所有人。每个人的生理特性和记忆习惯不同,因此个体间的记忆曲线可能会有所差异。为了优化个人学习效果,应结合自身的特点,找到最适合自己的...
【信息化解决方案——医疗行业电话预约呼叫中心】 随着社会的发展,医疗行业正面临前所未有的挑战,如人口老龄化、环境污染以及人们对健康的日益重视。这使得医疗服务的需求急剧增加,电话预约挂号成为解决医疗资源...
MySQL密码遗忘的解决方法
**艾宾浩斯遗忘曲线** 是心理学家赫尔曼·艾宾浩斯提出的理论,它揭示了人类在学习过程中的遗忘规律。这个理论指出,记忆并非一成不变,而是随着时间的推移,遗忘会遵循一个特定的模式。具体来说,信息在初次学习后...
在探讨ChatGPT的“人化”过程中,一个核心议题是人类的“遗忘”特质。ChatGPT作为数字生命体,具备纯粹的记忆功能,能够存储大量信息且难以自动遗忘,这成为了其首要局限。人类的遗忘不仅是生物学上的特性,更在伦理...
在大数据时代,个人信息的收集、处理和利用变得日益普遍,这引发了关于个人隐私权和“被遗忘权”的激烈讨论。"被遗忘权"是欧洲等地法律中提出的一个概念,允许个人要求删除网络上与其相关的不准确、不相关或过时的...