强制转换函数指针Release()的正确方法

Correct way to cast function pointer Release()

本文关键字:方法 Release 转换 函数 指针      更新时间:2023-10-16

在尝试对以下代码强制转换函数时出现此错误:

错误C2440:"类型强制转换":无法从"重载函数"转换为"ULONG(__stdcall*)(void)"

HRESULT hr = RealCoGetClassObject ( rclsid, dwClsContext, pServerInfo, riid, ppv );
if ( hr == S_OK )
{
    IUnknown * iukn = (IUnknown *)ppv;
    ULONG (WINAPI * RealRelease)() = (ULONG (WINAPI *)(void))(iukn->Release);
}

HRESULT hr = RealCoGetClassObject ( rclsid, dwClsContext, pServerInfo, riid, ppv )

这里的ppv参数应该是指向变量的指针,该变量将使用接口指针进行初始化。尽管您的片段并不能清楚地说明您要做什么,但调用后的强制转换看起来您在调用时还没有传递正确的指针。你应该抛出这样的论点:

IUnknown * iukn;
HRESULT hr = RealCoGetClassObject ( rclsid, dwClsContext, pServerInfo, riid, 
    (VOID**) &iukn);
if(SUCCEEDED(hr))
{
    // NOTE: Hey, we got it into `iukn`
    // ...
    iukn->Release();

或者,否则,如果您确定ppv在调用时是有效的,并且您想要替换返回的poniter,那么强制转换如下所示:

HRESULT hr = RealCoGetClassObject ( rclsid, dwClsContext, pServerInfo, riid, 
    ppv);
if(SUCCEEDED(hr))
{
    IUnknown*& iukn = *((IUnknown**) ppv);
    iukn->Release(); // Drop the returned thing
    iukn = ... // Put our stuff there

IUnknown::Release是一个方法,而不是函数。所以你必须使用方法指针而不是函数指针:

typedef ULONG(STDMETHODCALLTYPE IUnknown::*ReleaseMethodPtr) (void);
ReleaseMethodPtr realRelease = &IUnknown::Release;
// for calling the method, you also need an instance pointer
(iukn->*realRelease)();

话虽如此,但我并不知道你的意图是什么,我认为这不是你想要的。因为IUnknown::Release是一个(纯)虚拟方法,所以调用方法指针总是与调用iukn->Release()完全相同。