强制转换函数指针Release()的正确方法
Correct way to cast function pointer Release()
在尝试对以下代码强制转换函数时出现此错误:
错误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()
完全相同。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 通过方法访问结构
- 最小硬币更换问题(自上而下方法)
- C++为构建时间获取QDateTime的可靠方法
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 处理多个异常集合的C++方法
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 有什么方法可以遍历结构吗
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- 使用std::函数映射对象方法
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- C++从另一个类访问公共静态向量的正确方法是什么
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 没有为自己的结构调用列表推回方法
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 枚举环境变量的惯用C++14/C++17方法
- 强制转换函数指针Release()的正确方法