当前位置: 首页 > news >正文

在Windows编程中,MFC\C++中OnCopyData如何传递基础类型数据?

在C++中,OnCopyData 并不是一个标准的C++库或框架中的成员函数,它更常见于Windows编程中,特别是使用Win32 API或MFC(Microsoft Foundation Classes)时。OnCopyData 是一个在MFC应用程序中常用于处理来自其他应用程序的WM_COPYDATA消息的消息处理函数。当另一个应用程序通过SendMessagePostMessage函数发送WM_COPYDATA消息时,这个消息会携带一些数据,这些数据可以通过OnCopyData函数接收并处理。

WM_COPYDATA消息主要用于安全地在不同的应用程序之间传递数据,因为操作系统会帮助管理数据的内存,从而避免了直接内存访问的潜在风险。

如何传递基础类型数据

要在OnCopyData中传递基础类型数据(如int、float、char等),你首先需要将这些数据打包到一个结构体中,因为WM_COPYDATA消息期望的是一个指向COPYDATASTRUCT结构的指针,该结构包含指向数据的指针和数据的长度。

步骤
  1. 定义一个结构体:首先,你需要定义一个结构体来包含你想要传递的基础类型数据。

    typedef struct {DWORD dwData;  // 你可以使用这个字段来指定数据的类型或用途int myInt;     // 示例基础类型数据float myFloat; // 另一个示例
    } MY_COPYDATA_STRUCT, *PMY_COPYDATA_STRUCT;
    
  2. 发送数据:在发送方,你需要填充这个结构体,并调用SendMessagePostMessage函数发送WM_COPYDATA消息。

    MY_COPYDATA_STRUCT cds;
    cds.dwData = 12345; // 自定义标识符
    cds.myInt = 42;
    cds.myFloat = 3.14f;COPYDATASTRUCT cdsStruct;
    cdsStruct.cbData = sizeof(cds);
    cdsStruct.dwData = 12345; // 可以与结构体中的dwData不同,用于其他目的
    cdsStruct.lpData = &cds;SendMessage(hWndTarget, WM_COPYDATA, (WPARAM)hWndSource, (LPARAM)&cdsStruct);
    
  3. 接收数据:在接收方(即OnCopyData函数中),你需要解析这个结构体。

    void CYourWindow::OnCopyData(CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct)
    {if (pCopyDataStruct != NULL && pCopyDataStruct->cbData == sizeof(MY_COPYDATA_STRUCT)){PMY_COPYDATA_STRUCT pData = (PMY_COPYDATA_STRUCT)pCopyDataStruct->lpData;// 现在你可以使用pData->myInt和pData->myFloat了}
    }
    

注意事项

  • 确保发送和接收双方对dwData字段的理解是一致的,尽管在这个例子中它被用作两个不同的目的。
  • 检查cbData以确保接收到的数据长度与你的结构体大小相匹配,这有助于防止缓冲区溢出等安全问题。
  • WM_COPYDATA消息提供了一种相对安全的方式来在应用程序之间传递数据,但仍需谨慎使用,以避免安全漏洞。
http://www.lryc.cn/news/417067.html

相关文章:

  • 10款超好用的图纸加密软件推荐,2024企业常用图纸加密软件分享
  • BUUCTF [安洵杯 2019]easy_serialize_php 1
  • 前端面试宝典【CSS篇】【5】
  • stem32江科大自学笔记
  • C++-类与对象基础
  • 嵌入式day20
  • UE4 SLUA IOS打包报错解决办法
  • SpringDI(依赖注入) 以及SpringIOC容器对Bean管理
  • 伯克利Linux系统管理: 脚本编写学习 课堂与实验(系统简洁保姆级学习)
  • 探索腾讯云AI代码助手的效能与实用性
  • 清华大学终于把Python整理成了《漫画书》
  • 有关Linux操作系统中僵尸进程与孤儿进程的理解
  • Go语言实现依赖注入
  • 不仅能防沉迷游戏的防沉迷软件(Python)
  • 数学建模--智能算法之鱼群算法
  • html+css+js前端作业qq音乐官网5个页面 带js
  • 【mars3d】加载超图s3m模型说明
  • LeetCode Hot100 二叉搜索树中第K小的元素
  • CBK-D5-安全测试与开发osg15、20、21
  • 期权杠杆与期货杠杆的区别是什么?
  • 数字人解决方案——音频驱动机器人
  • Linux Tcp 连接 状态 检测 处理
  • String respIson = objectMapper.writeValueAsString(response);
  • git squash、merge 、 rebase
  • 案例开发-日程管理2第一期(超详细教程、配备图文和源代码注释,没学过也能看懂)
  • c# 逻辑运算符和条件运算符
  • Linux驱动开发—设备树传递给内核,匹配驱动过程分析
  • 深入理解 Go 语言信号量 Semaphore
  • git——删除远程仓库中的文件或文件夹步骤图解(只是从远程仓库中删除,本地文件不受影响、不会被删除)
  • 详解贪心算法