类成员函数地址

时间:2017-09-13 22:24:29

标签: c++ class directx

编辑这与所谓的帖子有什么关系?它们都是完全不同的错误,你们应该真的停止尝试农场代表

所以我一直在搜索谷歌和stackoverflow,但我找不到一个可以帮助我的案例的解决方案。 我有一个D3D9Device指针,我想要该设备的EndScene地址,我将如何接近呢?

DWORD aEndScene = *(DWORD*)(&d3ddev->EndScene);

无法使用以下错误

'&': illegal operation on bound member function expression

我认为这是错的,因为我实际上是想获取d3ddev类的地址

1 个答案:

答案 0 :(得分:1)

成员函数指针不是每个对象,它们是每种类型。在您的示例中,您可以拥有IDirect3DDevice9的多个实例,所有实例的EndScene成员函数都具有相同的指针值(假设它们不是不同的具体类型 - 但这不是可能)。

您获得的具体错误是因为您试图从对象获取指向成员函数的地址,这是无效的(例如,请参阅'&' illegal operation on bound member function expression error)。

可以使用类型而不是对象指针来获取成员函数的值。然而,这非常难看:

// Value is stored in 'end_scene':
HRESULT (IDirect3DDevice9::* end_scene)() = &IDirect3DDevice9::EndScene;
// Call the function, with the value of 'end_scene'.
(*d3ddev.*(end_scene))();
// Print the address of the pointer-to-member function:
printf("%p\n", end_scene);

我不建议这样做,因为IDirect3DDevice9中的大多数函数都没有相同的原型。实际上,只有BeginScene具有与EndScene相同的原型,并且很难想象调用可能是一个或另一个的情况,因为它们需要按特定顺序调用。您可以将这个用于获取/设置顶点/像素着色器常量的函数,因为它们具有相同的原型,但是,它可以很容易地存储一些其他外部状态以确定要调用的函数,以及更多简单。