gpt4 book ai didi

c++ - WM_COPYDATA 数组与 vector

转载 作者:行者123 更新时间:2023-11-27 22:53:48 24 4
gpt4 key购买 nike

我正在尝试通过 WM_COPYDATA 消息实现进程间通信。 COPYDATASTRUCT 的 lpData 成员不能包含指针。我的问题是,char 数组与其他数组或 vector 有什么区别。

当我像这里一样使用字符数组时,它会成功发送消息。

typedef struct tagMYSTRUCT {
wchar_t x[40] = {0};
} MYSTRUCT, *PMYSTRUCT;

但是当我使用一个 vector 时,接收应用程序无法获取它。

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;

typedef struct tagMYSTRUCT2 {
std::vector<OTHERSTRUCT> y;
} MYSTRUCT2, *PMYSTRUCT2;

我有一个外部全局 vector “gOtherStructList”。在程序的各个部分,都填充了这个全局变量。例如,

DWORD WINAPI foo(LPCTSTR lpchText) {
...
if (sizeof(lpchText[0]) == 2) {
wcscpy(gOtherStructList[0].one, lpchText);
}

...
}

然后,当我发送这个全局列表时,我使用 wcscpy() 将它复制到 MYSTRUCT2 变量(出于不相关的原因),用于每个元素的每个 wchar_t。

这是我发送给接收方应用程序的方式:

MYSTRUCT2 my_struct;    //my_struct.y is a vector

// Filled my_struct.y here with wcscpy()

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

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

如果有所不同,接收应用程序会使用这些消息,例如:

case WM_COPYDATA:
{
PCOPYDATASTRUCT pcopydata = (PCOPYDATASTRUCT)lParam;

switch (pcopydata->dwData) {

case MY_CASE:

// When I code this, it works
PMYSTRUCT p = (PMYSTRUCT)(pcopydata->lpData);
wcscpy(mylocalvar, p->x); // for char array

...
// But, this doesn't work.

std::cout << "New message received" << std::endl; // this gets printed, then program crashes.

PMYSTRUCT2 p = (PMYSTRUCT2)(pcopydata->lpData);
OTHERSTRUCT mylocallist[100],
wcscpy(mylocallist[0].one, p->y[0].one);
}

我明白为什么我们不能为 WM_COPYDATA 使用指针。我不明白的是,这些例子有什么区别。为什么我们可以使用字符数组而不是 vector ?

编辑: 根据信息性评论编辑了我的问题。

谢谢

最佳答案

std::vector 是使用指针在内部实现的,所以你不能发送它,但你可以发送它的数据,因为它保证在内存中是连续的,而且你的内部结构是一个 POD .

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

cds.cbData = sizeof(OTHERSTRUCT) *  my_struct.y.size();
cds.lpData = my_struct.y.data();

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

cds.lpData = &my_struct.y[0];

只要确保 vector 不为空即可。

在接收方:

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);

就我个人而言,我发现 MYSTRUCT2 没有用,而且有点误导。

关于c++ - WM_COPYDATA 数组与 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35108553/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com