【问题标题】:Getting 64-bit data in WM_COPYDATA command instead of expected 32-bit DWORD在 WM_COPYDATA 命令中获取 64 位数据,而不是预期的 32 位 DWORD
【发布时间】: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 来解决此问题,但我想“了解”基本概念,以便了解这可能会影响我的代码的其他地方。

【问题讨论】:

    标签: windows-7 types 64-bit


    【解决方案1】:

    听起来包装变了。

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

    【讨论】:

    • 啊哈!应该知道的。将 #pragma pack(4) 放在结构之前似乎已经成功了!谢谢,本。有人请投票!
    • @Nicholas:虽然您还没有投票的能力,但您应该能够通过单击我的答案左侧显示的复选标记大纲来批准您的问题的答案。
    • @Nicholas:另外,我建议使用 push 和 pop,这样您就不会影响程序其余部分的打包。
    • 这个链接对我很有帮助。对于 VS2008,我不需要为 32/64 位 IPC 打包。 code.msdn.microsoft.com/windowsdesktop/…
    猜你喜欢
    • 2015-09-12
    • 2010-09-07
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 2012-02-27
    • 2011-03-10
    相关资源
    最近更新 更多