【发布时间】:2016-01-30 23:37:03
【问题描述】:
我正在尝试通过 WM_COPYDATA 消息实现进程间通信。 COPYDATASTRUCT 的 lpData 成员不能包含指针。我的问题是,char数组和其他数组或向量有什么区别。
当我在这里使用 char 数组时,它会成功发送消息。
typedef struct tagMYSTRUCT {
wchar_t x[40] = {0};
} MYSTRUCT, *PMYSTRUCT;
但是当我使用向量时,接收应用程序无法获取它。
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;
我有一个外部全局向量“gOtherStructList”。在程序的各个部分,这个全局变量被填充。例如,
DWORD WINAPI foo(LPCTSTR lpchText) {
...
if (sizeof(lpchText[0]) == 2) {
wcscpy(gOtherStructList[0].one, lpchText);
}
...
}
然后,当我发送这个全局列表时,我将它复制到 MYSTRUCT2 变量中(出于不相关的原因),并为每个元素的每个 wchar_t 使用 wcscpy()。
这是我发送到接收者应用程序的方式:
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 使用指针。我不明白的是,这些例子有什么区别。为什么我们可以使用 char 数组而不能使用向量?
编辑: 根据信息丰富的 cmets 编辑了我的问题。
谢谢
【问题讨论】:
-
WM_COPYDATA 可以跨进程边界编组单个内存块。如果您需要传递结构化数据,则需要对其进行序列化,并在接收过程中对其进行反序列化。我猜
OTHERSTRUCT直接或间接包含指针。指针仅在它们源自的进程中有效。 -
OTHERSTRUCT 有 5 个 wchar_t 数组。而已。但是当我尝试复制它们时,它会给出与第一个示例不同的错误。
-
你必须出示
OTHERSTRUCT的声明 -
在发送端显示
OTHERSTRUCT的声明和填写MYSTRUCT2的代码。那些 wchar_t 数组是 nul 终止的吗? -
除非我是盲人,否则刚才贴出的部分代码(包括结构定义)没有任何问题。也许发送消息的代码有问题? (最佳猜测:您计算的尺寸不正确。)
标签: c++ arrays winapi vector ipc