Как создать пользовательские wm_copydata в MFC C ++ - PullRequest
1 голос
/ 08 марта 2011

Как мне создать собственное сообщение Windows, которое передает любые данные в другую программу.

Я обмениваюсь сообщениями между GUI-программой и серверной программой. Мой опыт в * nix-программировании, и я немного заблудился в мире Windows.

В настоящее время обе программы создаются мастером Visual Studio, выбрав «Оконное приложение MFC». Теперь я хочу элегантный способ общения между программами. Google дает мне Cwnd-> sendmessage + регистрацию ваших собственных сообщений и т. Д. Однако я не могу передать указатель на символ в другую программу со стандартными пользовательскими сообщениями (ну, я могу, но область памяти неверна, и программа segfaults). Итак, Google снова дает мне sendmessage (WM_COPYDATA, hparam, lparam), который распределяется. Когда гуглил маршаллинг ... я врезался в стену.

Я предполагаю, что маршаллированные сообщения (или их данные) передаются в общую область памяти, которая доступна для чтения только отправителю и программе-получателю (верно?). И, создав пользовательское сообщение с указателем маршалированных данных в виде lparam, я могу передать любой объект другой программе (правильно?). Как мне это сделать на практике? Я попробовал следующее:

pWin->SendMessage(pTargetWin, WM_CUSTOM_MESSAGE, pSourceWin, pData);

Выше работает, если pData является целым числом. Если pData является указателем на объект, я не могу использовать объект из-за отсутствия маршаллинга. Я знаю, что могу сделать обертку COPYDATASTRUCT для pData и изменить ее на WM_COPYDATA. Должен ли я сделать это вместо этого?

ш, Юха

1 Ответ

1 голос
/ 08 марта 2011

WM_COPYDATA выполняет маршалинг для вас, если вы правильно инициализировали COPYDATASTRUCT , который вы передаете как LPARAM (lpData - это указатель, а не dwData).Пользовательские сообщения этого не сделают, и вы не хотите переопределять сортировку вручную.Если вам нужен маршаллинг, используйте WM_COPYDATA.Это то, что вы спрашиваете?Похоже, вы уже знаете ответ.

Если вам нужно поддерживать несколько различных типов сообщений, вы можете просто вставить перечисление в COPYDATASTRUCT.dwData, чтобы указать, что означают остальные данные.Если четырех байтов недостаточно, вы можете определить заголовок для ваших данных.

Так или иначе, пока вы можете пропустить большую кучу нулей и единиц, вы можете передавать все что угодно.

...