【发布时间】:2011-04-11 03:10:25
【问题描述】:
我有一个旧的 Windows 应用程序,用 Visual C++ 6.0 编译,我需要在 x64 平台上工作。该应用程序实际上似乎没问题,因为我使用了非常仔细的数据输入,但它与 Outlook 插件交互,我必须将其重新编译为 x64 dll 才能将其加载到 Outlook 64 位版本中。
插件使用 WM_COPYDATA 消息向主应用程序发送数据,发送的数据是一个结构体,如下所示:
{
DWORD dwData1;
char pszData2[32];
DWORD dwData3;
}
事情不正常,所以我做了一些调试,结果发现当 64 位加载项向 32 位程序发送数据时,每个 DWORD 都以 64 位(8 字节)的形式出现,由于程序需要 32 位 DWORD(4 个字节),因此完全放弃了结构。查看内存中的数据,我可以看到每个 DWORDS 的额外 4 个字节,在 32 字节字符串之前和之后。
现在在这里对 Stack Overflow 和其他地方进行一些研究。我看到 DWORD 据说即使在 x64 平台上也保留了 32 位长度,这是 Microsoft 的选择。在 64 位土地上执行 TRACE(sizeof(DWORD)) 我得到了预期的 4 个字节。
那么是什么导致我的 64 位加载项使用每个 DWORD 发送 64 位?
我通过将结构定义更改为使用 DWORD32 来解决此问题,但我想“了解”基本概念,以便了解这可能会影响我的代码的其他地方。
【问题讨论】: