Windows 7 在WM_COPYDATA命令中获取64位数据,而不是预期的32位DWORD 我有一个旧的Windows应用程序,在Visual C++ 6中编译,我需要在X64平台上工作。由于我使用了非常仔细的数据输入,该应用程序实际上看起来还不错,但它与Outlook加载项交互,我不得不将其重新编译为x64 dll,以便将其加载到Outlook 64位版本中

Windows 7 在WM_COPYDATA命令中获取64位数据,而不是预期的32位DWORD 我有一个旧的Windows应用程序,在Visual C++ 6中编译,我需要在X64平台上工作。由于我使用了非常仔细的数据输入,该应用程序实际上看起来还不错,但它与Outlook加载项交互,我不得不将其重新编译为x64 dll,以便将其加载到Outlook 64位版本中,windows-7,types,64-bit,Windows 7,Types,64 Bit,外接程序使用WM_COPYDATA消息将数据发送到主应用程序,发送的数据是一个结构,如下所示: { DWORD dwData1; char pszData2[32]; DWORD dwData3; } 事情不正常,所以我进行了一些调试,结果表明,当64位外接程序向32位程序发送数据时,每个DWORD都以64位(8字节)的形式出现,因为程序需要32位DWORD(4字节),所以结构完全关闭。查看内存中的数据,我可以看到32字节字符串前后每个DWORD额外的4个字节 现在在这里做一些关于堆栈溢出和其

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

{
DWORD dwData1;
char pszData2[32];
DWORD dwData3;
}
事情不正常,所以我进行了一些调试,结果表明,当64位外接程序向32位程序发送数据时,每个DWORD都以64位(8字节)的形式出现,因为程序需要32位DWORD(4字节),所以结构完全关闭。查看内存中的数据,我可以看到32字节字符串前后每个DWORD额外的4个字节

现在在这里做一些关于堆栈溢出和其他方面的研究。我发现,即使在x64平台上,DWORD也应该保留32位长度,这是微软的选择。在64位区域中进行跟踪(sizeof(DWORD))得到了预期的4个字节

那么,是什么原因导致我的64位外接程序在每个DWORD中发送64位


我通过将结构定义更改为使用DWORD32解决了这一问题,但我想“获取”基本概念,以便了解这可能会影响我的代码的其他地方。

听起来包装有所改变


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

Aha!我早该知道的。将#pragma pack(4)放在struct之前似乎成功了!谢谢你,本。有人请投票支持这个@尼古拉斯:虽然你还没有投票的能力,但你应该可以通过单击我答案左边的复选框来批准你的问题的答案。@Nicholas:另外,我建议使用推送和弹出,这样你就不会影响程序其余部分的打包。这个链接对我很有帮助。对于VS2008,我不需要32/64位IPC的软件包。