我需要在 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[...];
};
pData
是 gpSharedBlock
上的 __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/