`
java-mans
  • 浏览: 11434357 次
文章分类
社区版块
存档分类
最新评论

《Windows核心编程》---数据复制消息WM_COPYDATA

 
阅读更多

WM_COPYDATA是一个非常特殊的消息,此消息可能携带一个比较大的消息参数,而其他消息都只能携带两个固定大小的参数(WPARAMLPARAM)。

WM_COPYDATA的两个参数如下:

wParam //发送或传递这个消息的窗口

lParam //指向包含要发送的数据的COPYDATASTRUCT结构的指针

在发送WM_COPYDATA消息时,WM_COPYDATAwParam参数应该赋值为发送此消息的窗口,而lParam消息参数指向一个COPYDATASTRUCT结构类型的变量:

typedef struct tagCOPYDATASTRUCT {

ULONG_PTR dwData; //可以是任意值

DWORD cbData; //lpData内存区域的字节数

PVOID lpData; //需要发送给目标窗口所在进程的数据

} COPYDATASTRUCT, *PCOPYDATASTRUCT;

在消息发送时,系统会将整个COPYDATASTRUCTlpData所指向的内容全部发送给目标进程。目标进程窗口在收到WM_COPYDATA后,可以从lParam参数中提取出数据。

数据发送端代码片段:

// ************ Globals ************

//

#define ASCEDISPLAY 1

typedef struct tagASCEREC //将用户输入的消息封装在这个结构中

{

wchar_t s1[80];

wchar_t s2[80];

DWORD n;

} ASCEREC;

COPYDATASTRUCT AsceCDS;

ASCEREC AsceRec;

HRESULT hResult;

BOOL CALLBACK InfoDlgProc( HWND, UINT, WPARAM, LPARAM );

// ************ Code fragment ****************

// Get data from user. InfoDlgProc stores the information in AsceRec.

//

DialogBox( ghInstance, TEXT("InfoDlg"), hWnd, (DLGPROC) InfoDlgProc );

//

// Copy data into structure to be passed via WM_COPYDATA.

// Also, we assume that truncation of the data is acceptable.

//

hResult = StringCbCopy(AsceRec.s1, sizeof(AsceRec.s1), szFirstName );

if (hResult != S_OK)

return False;

hResult = StringCbCopy(AsceRec.s2, sizeof(AsceRec.s2), szLastName );

if (hResult != S_OK)

return False;

AsceRec.n = nAge;

//

// Fill the COPYDATA structure

//

AsceCDS.dwData = ASCEDISPLAY; // function identifier

AsceCDS.cbData = sizeof( AsceRec ); // size of data

AsceCDS.lpData = &AsceRec; // data structure

//

// Call function, passing data in &AsceCDS

//此处假设接收进程具有一个类名为Disp32Class标题为"Hidden Window"窗口

hwDispatch = FindWindow( TEXT("Disp32Class"), TEXT("Hidden Window"));

if( hwDispatch != NULL )

SendMessage( hwDispatch, //接收消息的窗口的句柄

WM_COPYDATA, //要发送的消息

(WPARAM)(HWND) hWnd, //发送或传递这个消息的窗口

(LPARAM) (LPVOID) &AsceCDS ); //指向包含要发送的数据的

//COPYDATASTRUCT结构的指针

else

MessageBox( hWnd, TEXT("Can't send WM_COPYDATA"), TEXT("ASCEApp"), MB_OK );

数据接收端代码片段:

// ************ Globals ************

//

#define ASCEDISPLAY 1

typedef struct tagASCEREC

{

wchar_t s1[80];

wchar_t s2[80];

DWORD n;

} ASCEREC;

PCOPYDATASTRUCT pAsceCDS;

void WINAPI AsceDisplay( LPTSTR, LPTSTR, DWORD );

//

// ************ Code fragment ****************

//

case WM_COPYDATA:

pAsceCDS = (PCOPYDATASTRUCT) lParam;

switch( pAsceCDS->dwData )

{

case ASCEDISPLAY:

AsceDisplay( (LPTSTR) ((ASCEREC *)(pAsceCDS->lpData))->s1,

(LPTSTR) ((ASCEREC *)(pAsceCDS->lpData))->s2,

(DWORD) ((ASCEREC *)(pAsceCDS->lpData))->n );

}

break;

WM_COPYDATA消息的不足之处:

1)必须要有一个窗体来接收消息和数据(缺乏灵活性),数据在使用之前先得拷贝到一个映射文件(浪费资源);

2)只能是本机内的进程间通信;

3)必须让两个进程在启动后,相互知道主窗口的HWND(至少一方);

4)使用WM_COPYDATA消息时,只能用SendMessage()函数发送而不能使用PostMessage(),而这两个函数的区别是SendMessage()发出消息后不是立即返回,而是在接收方的消息响应函数处理完之后才返回,并能够得到返回结果,在此期间发送方程序将被阻塞,即SendMessage()函数后面的语句不能被继续执行;而PostMessage()函数在发出消息后将立即返回,且无法获得消息的执行结果。

由此可见,在交换数据量较大的情况下实现数据频繁而快速地交换时,使用WM_COPYDATA消息的方法不合适,因为当数据传输过于频繁时,容易导致数据的丢失。

分享到:
评论

相关推荐

    精通Windows.API-函数、接口、编程实例.pdf

    11.4 数据复制消息(WM_COPYDATA) 327 11.4.1 数据发送端 327 11.4.2 数据接收端 330 11.5 其他进程间通信方式 332 11.5.1 动态数据交换(DDE)和网络动态数据交换(NDDE) 332 11.5.2 通过File Mapping在进程...

    精通WindowsAPI 函数 接口 编程实例

    11.4 数据复制消息(WM_COPYDATA) 327 11.4.1 数据发送端 327 11.4.2 数据接收端 330 11.5 其他进程间通信方式 332 11.5.1 动态数据交换(DDE)和网络动态数据交换(NDDE) 332 11.5.2 通过File Mapping在进程...

    Delphi5开发人员指南

    第1章 Delphi 5下的Windows编程 1 1.1 Delphi产品家族 1 1.2 Delphi是什么 3 1.2.1 可视化开发环境 3 1.2.2 编译器的速度和已编译代码的效 率 4 1.2.3 编程语言的功能及其复杂性 4 1.2.4 数据库结构的灵活性和可...

    精通WindowsAPI.pdf

    2.3 Windows API核心DLL..................................................................................................35 2.3.1 Kerne132.dll..............................................................

    (更新至2022年)城镇男性就业人员调查周平均工作时间.xls

    数据来源:中国人口与就业统计NJ-2023版

    各地区技工院校综合情况(2022年).xls

    数据来源:中国劳动统计NJ-2023版

    基于matlab实现样本熵算法,可用于提取生理信号的特征参数

    基于matlab实现样本熵算法,可用于提取生理信号的特征参数,运算速度较快,m=1或2;r=0.1_std(data)~0.25_std(data)最佳。.rar

    蜂网-SCM车销访销业务.pptx

    蜂网_SCM车销访销业务.pptx

    数据更新至2020年国民经济主要指标一览表.xls

    数据来源:中国电力统计NJ-2021版

    图书借阅管理系统设计与实现及论大学生写作能力.docx

    图书借阅管理系统设计与实现及论大学生写作能力.docx

    node-v10.19.0-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    商品零售价格分类指数(2022年)(上年=100).xls

    数据来源:中国劳动统计NJ-2023版

    数据更新至2020年电网建设 本年开工规模.xls

    数据来源:中国电力统计NJ-2021版

    基于数据服务的信息需求管理系统设计与实现.docx

    基于数据服务的信息需求管理系统设计与实现.docx

    基于matlab实现的多个无人机的群飞行仿真 多个无人机的群飞行仿真.rar

    基于matlab实现的多个无人机的群飞行仿真 多个无人机的群飞行仿真.rar

    #-001-mysql-快递管理系统ssm(毕设和论文)

    随着物流行业信息化的深入使得物流过程中货物的状态和变化透明化,现代信息化的接入使得物流成本和费用的更容易被掌握,从而增强了信息的准确性。与此同时动态信息能够被及时掌握,根据实际情况做出快速而有效的反应,实现物流运作的动态决策。信息的及时、全面的获取与加工,供需双方可以充分的信息共享与沟通,使得物流服务更准确、从而提高客户的满意度;同时顾客可以有更多自我服务功能,可以随意定义自己的定制的物流服务;另外在提供物流服务的同时,可以为顾客提供信息、资金等双赢的增值服务。 该系统用spring mvc和MySQL实现了快递管理系统。快递管理系统有着很好的应用前景,随着计算机技术和网络技术的发展,它的功能将会得到不断的发展和完善。本系统可以根据实际应用的具体情况,适当加以修改,以便更好应用。本系统操作简单,灵活性好,系统安全性高,运行稳定。本文详细介绍了快递管理系统开发和设计的全过程。

    各地区分行业其他单位就业人员和工资总额(2022年).xls

    数据来源:中国劳动统计NJ-2023版

    node-v11.14.0-darwin-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于VB实现的医疗纠纷检索系统设计(源代码+系统).zip

    【作品名称】:基于VB实现的医疗纠纷检索系统设计(源代码+系统) 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。

    数据更新至2020年分布式太阳能发电情况.xls

    数据来源:中国电力统计NJ-2021版

Global site tag (gtag.js) - Google Analytics