Получение 64-разрядных данных в команде WM_COPYDATA вместо ожидаемого 32-разрядного DWORD

#windows-7 #types #64-bit

#windows-7 #типы #64-разрядный

Вопрос:

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

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

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

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

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

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

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

Ответ №1:

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

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

Комментарии:

1. Ага! Должен был знать. Добавление #pragma pack(4) перед структурой, похоже, сделало свое дело! Спасибо, Бен. Кто-нибудь, пожалуйста, проголосуйте за это!

2. @Nicholas: Хотя у вас еще нет возможности отдавать голоса, вы должны иметь возможность одобрить ответ на свой вопрос, щелкнув контур флажка, который появляется слева от моего ответа.

3. @Nicholas: Кроме того, я рекомендую использовать push и pop, чтобы вы не влияли на упаковку для остальной части программы.

4. Эта ссылка была для меня полезной. Для VS2008 мне не нужен пакет для 32/64-разрядного IPC. code.msdn.microsoft.com/windowsdesktop /…