#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 /…