У меня есть старое приложение для 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, но я хотел бы «получить» фундаментальную концепцию, чтобы узнать, где еще это может повлиять на мой код.