Получение 64-битных данных в команде WM_COPYDATA вместо ожидаемого 32-битного DWORD - PullRequest
2 голосов
/ 11 апреля 2011

У меня есть старое приложение для Windows, скомпилированное в Visual C ++ 6.0, которое мне нужно для работы на платформах x64. Приложение на самом деле выглядит нормально, поскольку я использовал довольно осторожный набор данных, но он взаимодействует с надстройкой Outlook, которую мне пришлось перекомпилировать в виде x64-библиотеки DLL, чтобы загрузить ее в 64-разрядную версию Outlook.

Надстройка отправляет данные в основное приложение с помощью сообщения WM_COPYDATA, отправленные данные имеют следующую структуру:

{
DWORD dwData1;
char pszData2[32];
DWORD dwData3;
}

Все не работает, поэтому я выполнил некоторую отладку, и оказалось, что когда 64-битная надстройка отправляет данные в 32-битную программу, DWORD-ы появляются как 64-битные (8 байт) каждый, полностью исключить структуру, так как программа ожидает 32-битные DWORD (4 байта). Просматривая данные в памяти, я вижу дополнительные 4 байта для каждого из DWORDS до и после 32-байтовой строки.

Теперь проведем некоторое исследование здесь о переполнении стека и в других местах. Я вижу, что DWORD предположительно сохранил 32-битную длину даже на платформах x64, как выбрал Microsoft. И делая TRACE (sizeof (DWORD)) на 64-битной земле, я получаю 4 байта, как и ожидалось.

Так что может быть причиной того, что моя 64-битная надстройка отправляет 64 бит с каждым DWORD?

Я решил эту проблему, изменив определение структуры на использование DWORD32, но я хотел бы «получить» фундаментальную концепцию, чтобы узнать, где еще это может повлиять на мой код.

1 Ответ

7 голосов
/ 11 апреля 2011

Похоже, что упаковка изменилась.

Используйте #pragma pack вокруг вашего объявления структуры, чтобы компилятор не вставлял отступы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...