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

时间:2011-04-11 03:10:26

标签: windows-7 types 64-bit

我有一个旧的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和其他地方做一些研究。我认为,即使在x64平台上,作为微软的选择,DWORD仍然保留了32位长度。在64位域中执行TRACE(sizeof(DWORD)),我得到4个字节。

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

我通过将结构定义更改为使用DWORD32解决了这个问题,但我想“获取”基本概念,以便知道这可能会对我的代码产生什么影响。

1 个答案:

答案 0 :(得分:7)

听起来好像打包了。

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