尝试在下面的代码上转换函数时出现此错误:
错误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);
}
答案 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()
完全相同。