Я пытаюсь достичь межпроцессного взаимодействия через сообщения WM_COPYDATA. Член lpData COPYDATASTRUCT не может содержать указатели. Моя проблема в том, в чем разница между массивами символов и другими массивами или векторами.WM_COPYDATA с массивом против вектора
Когда я использую массив символов, как здесь, он успешно отправляет сообщения.
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 (по другим причинам) с wcscpy() для каждого 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 , Я не понимаю, в чем разница этих примеров. Почему мы можем использовать массивы символов, но не векторы?
Редактировать:Отредактировал мой вопрос, на основе содержательных комментариев.
Благодаря
[WM_COPYDATA] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms649011.aspx) может мобилизовать единый кусок памяти через процесс Boun daries. Если вам нужно связывать структурированные данные, вам необходимо его сериализовать и десериализовать в процессе получения. Я предполагаю, что 'OTHERSTRUCT' содержит указатели, прямо или косвенно. Указатели действительны только в том процессе, из которого они происходят. – IInspectable
OTHERSTRUCT имеет 5 массивов wchar_t. Больше ничего. Но когда я пытаюсь их скопировать, это дает ошибку, в отличие от первого примера. – ilkerpyci
Вы должны показать декларацию 'OTHERSTRUCT' –