gpt4 book ai didi

c++ - 访问在 C 中保存 C++ 对象的空指针的内容

转载 作者:太空宇宙 更新时间:2023-11-04 01:10:45 27 4
gpt4 key购买 nike

我正在使用 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com