Как привести LRESULT к пользовательскому типу структуры?

я использую sendMessage а также replyMessage общаться между двумя приложениями на одном ноутбуке. На стороне получателя, когда он получает сообщение от отправителя, он отвечает сообщением. Таким образом, в процессе отправителя, он будет разыгрывать MyStruct LRESULT, отправьте ответ на это приложению отправителя. Я попытался отбросить его обратно в приемник, это тоже работает.

    PCOPYDATASTRUCT result;
MyStruct* data;
LRESULT a;
MyStruct* t;
MyStruct* reply = new MyStruct;
switch (uMessageType)
{
case WM_COPYDATA:
result = (PCOPYDATASTRUCT)addtionalData;
data = (MyStruct*)result->lpData;

reply->msgId = 10;
strcpy_s(reply->msgInfo, 100, "test reply");
a = reinterpret_cast<LRESULT>(reply);
t = reinterpret_cast<MyStruct*>(a);//when cast the LRESULT data to MyStruct back here, it succeed

ReplyMessage(reinterpret_cast<LRESULT>(reply));break;

Тем не менее, когда я пытался привести этот LRESULT к MyStruct на стороне отправителя это не удается:

LRESULT result = SendMessage(test, WM_COPYDATA, (WPARAM)(HWND)hwndC, (LPARAM)(LPVOID)&data);
MyStruct* reply = (MyStruct*)result;//the value of reply is unreadable

Как я могу преобразовать LRESULT в мою собственную структуру на стороне отправителя?

Я просто попытался отправить интергер или поплавок, кстати. Оно работает. Тем не менее, если я использую пользовательскую структуру MyStructэто не сработает. Я думаю, это потому, что размер LRESULT короче MyStruct.Как решить эту проблему ? Размер LRESULT равен 4, размер int также равен 4.

typedef struct msg{
int msgId;
char msgInfo[100];
}MyStruct;

-1

Решение

Когда вы отправляете WM_COPYDATA, сами данные копируются в процесс получения.
Получатель WM_COPYDATA получает указатель на эту копию.
Маловероятно, что адреса одинаковы на обоих концах, но у каждого конца есть действительный указатель на свою собственную копию данных.

С другой стороны, ReplyMessage не выполняет такое копирование и возвращает только (переосмысленный) адрес данных отправителя.
Это недействительный адрес на принимающей стороне.

Если вы хотите передавать данные туда и обратно, вам нужно использовать SendMessage с WM_COPYDATA в обоих направлениях, возможно добавив свой собственный протокол сверху.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]