c++ - Windows 64 位和 32 位之间的共享内存接口(interface)

标签 c++ pointers 32bit-64bit

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

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

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

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

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

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

我读过有关WOW64的内容,并且我认为W32程序正在其下运行,但我不知道如何利用它。有什么想法吗?

最佳答案

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

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

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

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

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

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

关于c++ - Windows 64 位和 32 位之间的共享内存接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8528786/

相关文章:

c++ - 为什么我不能返回数组?

c++ - 查询内存位置

c# - 是否可以为 Visual Studio 2010 编写 Debugger Visualizer 来显示 64 位 .NET 程序?

windows - 对于 64 位 Windows 上的 32 位应用程序,64 位操作是原子的吗

java - C++ 成员变量语义

c++ - 将迭代器变成标量索引?

c++ - 如何在 C++ 中使用常量数组的成员函数?

c - C中的双指针并重新分配空指针

c - 在函数递归中传递双指针

windows - 有没有办法在 32 位计算机上执行 64 位程序?