我们在通过 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);