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

问题描述:

我有一个旧的Windows应用程序,在Visual C++ 6.0中编译,我需要在x64平台上工作。该应用程序似乎是确定的,因为我使用了非常小心的数据类型,但它与Outlook外接程序进行交互,我必须重新编译为x64 dll,才能将其加载到Outlook 64位版本中。获取64位数据在WM_COPYDATA命令而不是预期的32位DWORD

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

{ 
DWORD dwData1; 
char pszData2[32]; 
DWORD dwData3; 
} 

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

现在在Stack Overflow和其他地方做一些研究。作为微软的选择,我发现即使在x64平台上DWORD也保留了32位长度。并在64位的土地做一个TRACE(sizeof(DWORD))我得到4个字节的预期。

那么,什么可能导致我的64位加载项发送64位与每个DWORD?

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

听起来像包装发生了变化。

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

+0

啊哈!应该知道。在结构体之前放置#pragma pack(4)似乎已经成功了!谢谢,本。有人请投票! – Nicholas 2011-04-11 03:41:41

+0

@尼古拉斯:虽然你还没有能力投出更多的投票,但你应该能够通过点击我答案左侧的复选标记来批准你的问题的答案。 – 2011-04-11 04:09:47

+0

@Nicholas:另外,我建议使用push和pop,这样就不会影响程序其余部分的包装。 – 2011-04-11 04:10:38