【问题标题】:Shared Memory Interface between Windows 64 bits and 32 bitsWindows 64 位和 32 位之间的共享内存接口
【发布时间】:2012-01-21 15:53:36
【问题描述】:

我需要在 Windows 7(64 位)中编写代码,以执行具有共享内存接口 (SMI) 的 32 位程序。更准确地说,我正在编写的程序写入 SMI,而 32 位程序则从该 SMI 中读取。

我遇到的第一个问题是我无法访问 32 位程序的源代码,这个问题无法解决。第二个问题是 SMI 存储了写入信息的地址。使用以下代码将此指向的指针存储为基于指针:

gpSharedBlock->m_pData[uiDataPointer] = (char __based(gpSharedBlock)*)pData;

如果 pData 是指向我们正在写入的数据的指针,而 gpSharedBlock->m_pData[i] 指向存储的第 i^th 个元素。

可能从这里你已经注意到了这个问题; W32 中的指针为 4 字节,而 W64 中的指针为 8 字节。那么,由于存储的值是一个64位的指针,所以32位程序最终读取的值并不是我们想要的。

我的问题是:有没有办法将 64 位地址转换为 32 位地址,以便正在运行的程序读取正确的信息?

我已经阅读了 WOW64,并且我认为 W32 程序正在其下运行,但我不知道如何利用它。有什么想法吗?

【问题讨论】:

    标签: c++ pointers 32bit-64bit


    【解决方案1】:

    __based 指针是相对于另一个指针的数字偏移量。它实际上是在运行时解释的虚拟指针。

    指针在 64 位中是 8 个字节,因此为了与 32 位程序兼容,您必须在 64 位代码中声明 SharedBlock 类型的指针成员以使用 4 位整数而不是指针,例如:

    struct sSharedBlock
    {
        int32_t m_pData[...];
    };
    

    pData__based 上的gpSharedBlock,所以pData 的值是gpSharedBlock 值的相对偏移量。使用该事实来确定数据块相对于gpSharedBlock 内存块的实际字节偏移量,然后将该偏移值作为整数存储到m_pData[]。这就是 SMI 内存块实际上所期望的——一个偏移量,而不是一个真正的指针。 __based 关键字只是一种使用指针处理偏移量的奇特方式,无需在代码中手动进行偏移量计算。

    原始代码实际上与以下代码相同,不需要 __based 关键字:

    gpSharedBlock->m_pData[uiDataPointer] = (int32_t) ( ((char*)pData) - ((char*)gpSharedBlock) );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-28
      • 2010-12-18
      • 1970-01-01
      • 2011-12-11
      • 2014-08-23
      • 1970-01-01
      • 2010-12-21
      相关资源
      最近更新 更多