我需要在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__based上的gpSharedBlock,因此pData的值是相对于gpSharedBlock值的相对偏移。使用该事实来确定数据块相对于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/

10-17 00:32