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

时间:2014-09-09 16:34:35

标签: c++ casting com

尝试在下面的代码上转换函数时出现此错误:

  

错误C2440:'输入' :无法转换为超载功能'到' ULONG(__ stdcall *)(无效)'

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

if ( hr == S_OK )
{
    IUnknown * iukn = (IUnknown *)ppv;
    ULONG (WINAPI * RealRelease)() = (ULONG (WINAPI *)(void))(iukn->Release);
}

2 个答案:

答案 0 :(得分:3)

  

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

答案 1 :(得分:0)

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()完全相同。