在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. 定义一个结构体:首先,你需要定义一个结构体来包含你想要传递的基础类型数据。

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

    cpp 复制代码
    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函数中),你需要解析这个结构体。

    cpp 复制代码
    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消息提供了一种相对安全的方式来在应用程序之间传递数据,但仍需谨慎使用,以避免安全漏洞。
相关推荐
孞㐑¥3 小时前
Linux之Socket 编程 UDP
linux·服务器·c++·经验分享·笔记·网络协议·udp
柳鲲鹏4 小时前
WINDOWS最快布署WEB服务器:apache2
服务器·前端·windows
水木兰亭6 小时前
数据结构之——树及树的存储
数据结构·c++·学习·算法
专注VB编程开发20年7 小时前
开机自动后台运行,在Windows服务中托管ASP.NET Core
windows·后端·asp.net
CoderCodingNo7 小时前
【GESP】C++四级考试大纲知识点梳理, (7) 排序算法基本概念
开发语言·c++·排序算法
秋风&萧瑟9 小时前
【C++】C++中的友元函数和友元类
c++
梁诚斌9 小时前
使用OpenSSL接口读取pem编码格式文件中的证书
开发语言·c++
李洋-蛟龙腾飞公司10 小时前
HarmonyOS NEXT应用元服务常见列表操作分组吸顶场景
linux·运维·windows
码农垦荒笔记10 小时前
Git 安装闭坑指南(仅 Windows 环境)
windows·git
阿幸软件杂货间11 小时前
Windows 10 2016 长期服务版
windows·系统·win10