在WM_COPYDATA命令中获取64位数据而不是预期的32位DWORD

Nic*_*las 2 64-bit types windows-7

我有一个旧的Windows应用程序,在Visual C++ 6.0中编译,我需要在x64平台上工作.该应用程序实际上似乎没问题,因为我使用了非常仔细的数据输入,但它与Outlook加载项交互,我必须重新编译为x64 dll才能将其加载到Outlook 64位版本中.

加载项使用WM_COPYDATA消息将数据发送到主应用程序,发送的数据是一个结构,如下所示:

{
DWORD dwData1;
char pszData2[32];
DWORD dwData3;
}
Run Code Online (Sandbox Code Playgroud)

事情没有用,所以我做了一些调试,事实证明,当64位加载项将数据发送到32位程序时,DWORD以64位(8字节)的形式进入,抛出结构完全关闭,因为程序需要32位DWORD(4个字节).查看内存中的数据,我可以看到每个DWORDS在32字节字符串之前和之后的额外4个字节.

现在在Stack Overflow和其他地方做一些研究.我认为,即使在x64平台上,作为微软的选择,DWORD仍然保留了32位长度.在64位域中执行TRACE(sizeof(DWORD))我得到4个字节,如预期的那样.

那么是什么原因导致我的64位加载项在每个DWORD中发送64位?

我通过改变我的结构定义来使用DWORD32解决了这个问题,但我想"获取"基本概念,以便知道这可能会影响我的代码.

Ben*_*igt 7

听起来像包装改变了.

#pragma pack在结构声明周围使用以防止编译器插入填充.