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

我们在通过 WM_COPYDATA 消息实现进程间通信时,发送char 数组或其他类型数组与发送vector是有区别的。

1、发送基础类型时,直接发送指针。

cpp 复制代码
typedef struct tagMYSTRUCT
{
    int nTest;
	wchar_t cTest[40] = {0};
} MYSTRUCT, *PMYSTRUCT;

MYSTRUCT stSend;
stSend.nTest = 10;
stSend.cTest = "test";

COPYDATASTRUCT cds;
cds.dwData = MY_CASE;
cds.cbData = sizeof(OTHERSTRUCT);
cds.lpData = &stSend;

SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);

2、发送使用vector时,可以使用 std::vector::data() 获得必要的指针,否则,接收应用程序无法获取它。

std::vector 是使用指针在内部实现的,内存不一定连续,所以不能直接发送它,但可以发送它的数据,因为它保证在内存中是连续的.

可以使用 std::vector::data() 获得必要的指针:

cpp 复制代码
typedef struct tagOTHERSTRUCT
{
    wchar_t one[40] = { 0 };
    wchar_t two[20] = { 0 };
    wchar_t three[20] = { 0 };
    wchar_t four[4] = { 0 };
    wchar_t five[3] = { 0 };
} OTHERSTRUCT, *POTHERSTRUCT;

注意:VC++ 对C++ 的支持有些欠缺,所以这个data() 在VS2010 或之前的版本中是不可用的。如果需要,可以将其替换为 :

cds.lpData = &OtherStructList[0];

只要确保 vector 不为空即可。

发送方

cpp 复制代码
std::vector<OTHERSTRUCT> OtherStructList;
......//OtherStructList成员赋值

COPYDATASTRUCT cds;
cds.dwData = MY_CASE;
cds.cbData = sizeof(OTHERSTRUCT) * OtherStructList.size();
cds.lpData = &OtherStructList.data();;

SendMessage(hWnd, WM_COPYDATA, NULL, (LPARAM)&cds);

接收方

cpp 复制代码
OTHERSTRUCT *begin = static_cast<OTHERSTRUCT*>(pcopydata->lpData);
OTHERSTRUCT *end = begin + pcopydata->cbData / sizeof(OTHERSTRUCT);
//copy the data into a vector, or treat them directly
std::vector<OTHERSTRUCT> recvData(begin, end);
相关推荐
一匹电信狗几秒前
【C++】红黑树详解(2w字详解)
服务器·c++·算法·leetcode·小程序·stl·visual studio
散峰而望3 分钟前
Dev-C++一些问题的处理
c语言·开发语言·数据库·c++·编辑器
进击的大海贼27 分钟前
QT/C++ 消息定时管理器
开发语言·c++·qt
kyle~41 分钟前
原子性与原子操作
运维·服务器·开发语言·c++
前路不黑暗@1 小时前
Java:继承与多态
java·开发语言·windows·经验分享·笔记·学习·学习方法
第七序章1 小时前
【C + +】C++11 (下) | 类新功能 + STL 变化 + 包装器全解析
c语言·数据结构·c++·人工智能·哈希算法·1024程序员节
AA陈超1 小时前
虚幻引擎5 GAS开发俯视角RPG游戏 P06-29 属性信息委托
c++·游戏·ue5·游戏引擎·虚幻
仰泳的熊猫1 小时前
LeetCode:72. 超级次方
数据结构·c++·算法·leetcode
打不了嗝 ᥬ᭄2 小时前
传输层协议TCP
linux·服务器·网络·c++·tcp/ip
敲上瘾2 小时前
Linux系统C++开发环境搭建工具(三)—— brpc使用指南
linux·c++·分布式·rpc