Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ WM_COPYDATA与数组vs向量_C++_Arrays_Winapi_Vector_Ipc - Fatal编程技术网

C++ WM_COPYDATA与数组vs向量

C++ WM_COPYDATA与数组vs向量,c++,arrays,winapi,vector,ipc,C++,Arrays,Winapi,Vector,Ipc,我试图通过WM_COPYDATA消息实现进程间通信。COPYDATASTRUCT的lpData成员不能包含指针。我的问题是,char数组和其他数组或向量有什么区别 当我像这里一样使用char数组时,它成功地发送消息 typedef struct tagMYSTRUCT { wchar_t x[40] = {0}; } MYSTRUCT, *PMYSTRUCT; 但当我使用向量时,接收应用程序无法得到它 typedef struct tagOTHERSTRUCT { wchar_t on

我试图通过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;
然后,当我发送这个全局列表时,我使用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);
}
case WM_COPYDATA:
{
PCOPYDATASTRUCT pcopydata=(PCOPYDATASTRUCT)LPRAM;
开关(pcopydata->dwData){
案例我的案例:
//当我编写这个代码时,它是有效的
PMYSTRUCT p=(PMYSTRUCT)(pcopydata->lpData);
wcscpy(mylocalvar,p->x);//用于字符数组
...
//但是,这不起作用。
std::cout y[0].1);
}
我理解为什么我们不能对WM_COPYDATA使用指针。我不理解的是,这些示例的区别是什么。为什么我们可以使用字符数组而不是向量

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


感谢您,std::vector是使用指针在内部实现的,因此您不能发送它,但可以发送它的数据,因为它保证在内存中是连续的,并且您的内部结构是POD

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

注:VC++在C++支持方面有点不足,所以 DATA()/VoC>在VS2010或之前不可用。如果需要,可以替换为:

cds.lpData = &my_struct.y[0];
只要确保向量不是空的

在接收端:

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);
OTHERSTRUCT*begin=static\u cast(pcopydata->lpData);
OTHERSTRUCT*end=begin+pcopydata->cbData/sizeof(OTHERSTRUCT);
//将数据复制到向量中,或直接处理它们
std::向量recvData(开始、结束);

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

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

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

注:VC++在C++支持方面有点不足,所以 DATA()/VoC>在VS2010或之前不可用。如果需要,可以替换为:

cds.lpData = &my_struct.y[0];
只要确保向量不是空的

在接收端:

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);
OTHERSTRUCT*begin=static\u cast(pcopydata->lpData);
OTHERSTRUCT*end=begin+pcopydata->cbData/sizeof(OTHERSTRUCT);
//将数据复制到向量中,或直接处理它们
std::向量recvData(开始、结束);

我个人认为
MYSTRUCT2
毫无用处,而且有点误导。

MYSTRUCT
OTHERSTRUCT
将其所有数据都包含在内部,没有指向外部内存的指针,因此它们可以通过
WM\u COPYDATA
作为单个内存块进行传输

另一方面,
MYSTRUCT2
包含
OTHERSTRUCT
元素的
std::vector
。只有
vector
本身位于
MYSTRUCT2
本身内部。
vector
内部包含指针(除其他外)到位于内存中其他位置的
OTHERSTRUCT
数组。因此,
MYSTRUCT2
无法通过
WM_COPYDATA
作为单个内存块进行传输,它需要序列化为平面数据块进行发送,然后在接收时进行反序列化,例如:

#pragma pack(push, 1)
typedef struct tagMYCDSDATA {
    int numItems;
    OTHERSTRUCT items[1];
} MYCDSDATA, *PMYCDSDATA;
#pragma pack(pop)

mystruct2myu结构;
//根据需要填写我的结构。。。
int count=my_struct.y.size();
向量缓冲区(sizeof(int)+(sizeof(OTHERSTRUCT)*计数);
PMYCDSDATA cdsdata=重新解释强制转换(&buffer[0]);
//或者,如果使用C++11:PMYCDSDATA cdsdata=reinterpret_cast(buffer.data());
数据->numItems=计数;
std::copy(my_struct.y.begin(),my_struct.y.end(),data->items);
复制数据结构光盘;
cds.dwData=我的案例;
cds.cbData=buffer.size();
cds.lpData=cdsdata;
SendMessage(gDataReceiver、WM_COPYDATA、NULL、reinterpret_cast(&cds));

case WM_COPYDATA:
{
PCOPYDATASTRUCT pcopydata=reinterpret_cast(lParam);
如果(pcopydata->dwData==我的案例)
{
std::cout numItems;++i)
{
//根据需要使用p->item[i].one等。。。
}
返回0;
}
打破
}

MYSTRUCT
OTHERSTRUCT
将其所有数据都包含在内部,没有指向外部内存的指针,因此它们可以通过
WM\u COPYDATA
作为单个内存块进行传输

另一方面,
MYSTRUCT2
包含
OTHERSTRUCT
元素的
std::vector
。只有
vector
本身位于
MYSTRUCT2
本身内部。
vector
内部包含指针(除其他外)到位于内存中其他位置的
OTHERSTRUCT
数组。因此,
MYSTRUCT2
无法通过
WM_COPYDATA
作为单个内存块进行传输,它需要序列化为平面数据块进行发送,然后在接收时进行反序列化,例如:

#pragma pack(push, 1)
typedef struct tagMYCDSDATA {
    int numItems;
    OTHERSTRUCT items[1];
} MYCDSDATA, *PMYCDSDATA;
#pragma pack(pop)

mystruct2myu结构;
//根据需要填写我的结构。。。
int count=my_struct.y.size();
向量缓冲区(sizeof(int)+(sizeof(OTHERSTRUCT)*计数);
PMYCDSDATA cdsdata=重新解释强制转换(&buffer[0]);
//或者,如果使用C++11:PMYCDSDATA cdsdata=reinterpret_cast(buffer.data());
数据->numItems=计数;
std::copy(my_struct.y.begin(),my_struct.y.end(),data->items);
复制数据结构光盘;
cds.dwData=我的案例;
cds.cbData=buffer.size();
cds.lpData=cdsdata;
SendMessage(gDataReceiver、WM_COPYDATA、NULL、reinterpret_cast(&cds));

case WM_COPYDATA: { PCOPYDATASTRUCT pcopydata = reinterpret_cast<PCOPYDATASTRUCT>(lParam); if (pcopydata->dwData == MY_CASE) { std::cout << "New message received" << std::endl; PMYCDSDATA p = static_cast<PMYCDSDATA>(pcopydata->lpData); for(int i = 0; i < p->numItems; ++i) { // use p->item[i].one, etc as needed... } return 0; } break; }