我正在使用 DynamoRIO 进行二进制检测在 C++ 程序上使用 C 客户端虽然您可能不需要了解 DynamoRIO 来回答我的问题。目前我正在包装一个具有签名的函数:
virtual void foo(Klass& s)
然后在包装函数中,我可以将此函数调用 (Klass& s
) 的参数获取到一个空指针 (void *arg1
)。我需要使用此参数(即访问字段、调用方法),但是我无法将其转换为适当的指针,因为 Klass
是一个 C++ 类,而我正在使用的客户端位于纯C。
当我尝试通过将 void*
转换为 size_t
来打印其内容时,例如:
printf("%zd\n", (size_t)arg1);
它给了我一个 8 位数字,例如 25102856
,我猜这是一个内存地址。
我的问题是如何在我的程序中访问这个对象?
请询问您需要的所有信息,我乐于接受所有想法。
最佳答案
要使其工作 - 为 getter 和 setter 定义 C 风格的包装器,如本例所示:
为了你的类(class)
class Klass {
public:
int getA() const;
void setA(int);
virtua int getB() const;
};
定义包装此类的 C 结构:
typedef int (*GetInt)(void*);
typedef void (*SetInt)(void*,int);
// and similar for other types
struct KlassCInterface {
void* object;
GetInt getA;
SetInt setA;
GetInt getB;
};
extern "C" int getA(void* obj)
{
return static_cast<Klass*>(klassObj)->getA();
}
...
KlassCInterface* getCInterface(Klass* obj)
{
// malloc just in case your client want to use free()
KlassCInterface* retVal = (KlassCInterface*)malloc(sizeof(KlassCInterface));
retVal->object = obj;
retVal->getA = &getA;
...
return retVal;
}
当您传递 void* 数据时,将其作为 C 接口(interface)结构传递:
Klass* obj = new Klass(...);
KlassCInterface* objC = getCInterface(obj);
registerData(objC);
在您的 C 代码中 - 使用此 C 接口(interface):
void doSthWihtKlass(void* data)
{
KlassCInterface* objC = (KlassCInterface*)data;
printf("%d\n", objC->getA(objC->object));
}
关于c++ - 访问在 C 中保存 C++ 对象的空指针的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919801/