WIC编解码器实现中IWICBitmapSource接口GetPixelFormat命名冲突咨询
核心问题1解答
你实现的接口函数不需要和原生WIC接口的函数同名。
WIC是基于COM架构实现的,接口调用完全依赖虚函数表(vtable)的内存布局,只要你自定义接口的虚表中,函数的排列顺序、调用约定、参数列表和官方IWICBitmapSource接口完全一致,WIC运行时就能正确调用到你的实现,和你给函数起的符号名没有任何关系。
核心问题2解答
你可以根据自己的需求二选一:
方案A:保留GetPixelFormat命名,解决重名冲突
冲突的根源是wingdi.h中导出了同名的全局GDI函数,你可以通过两种方式处理:
- 如果你的项目不需要用到GDI的GetPixelFormat功能,直接在包含wincodec.h之前添加宏定义即可:
#define NOGDI #include <wincodec.h>
NOGDI宏会阻止wingdi.h导出GDI相关的函数声明,从根源避免重名。
- 如果项目必须用到GDI的GetPixelFormat,在声明和实现你的接口函数之前临时取消同名宏即可:
// 头文件中声明方法前加 #undef GetPixelFormat STDMETHOD(GetPixelFormat) (THIS_ WICPixelFormatGUID* pPixelFormat) PURE; // 源文件中实现函数前加 #undef GetPixelFormat static HRESULT STDMETHODCALLTYPE GetPixelFormat(MgfFrameDecoder* This, WICPixelFormatGUID* pPixelFormat) { *pPixelFormat = GUID_WICPixelFormat32bppBGRA; return S_OK; }
注意:你当前的实现代码漏了第一个THIS指针参数,补上才能正常运行。
方案B:修改函数名避免冲突,直接关联到虚表
你可以给实现函数起任意不会冲突的名称,比如MgfDecoder_GetPixelFormat,只要保证这个函数指针放在虚表中对应GetPixelFormat的位置即可:
- 头文件中修改方法声明的名称:
STDMETHOD(MgfDecoder_GetPixelFormat) (THIS_ WICPixelFormatGUID* pPixelFormat) PURE;
- 源文件中实现对应名称的函数:
static HRESULT STDMETHODCALLTYPE MgfDecoder_GetPixelFormat(MgfFrameDecoder* This, WICPixelFormatGUID* pPixelFormat) { *pPixelFormat = GUID_WICPixelFormat32bppBGRA; return S_OK; }
注意:你当前的接口方法顺序和官方IWICBitmapSource的顺序完全一致,虚表布局是对的,只要参数和调用约定没问题,WIC就能正常识别。
内容的提问来源于stack exchange,提问作者Laplace
相关产品推荐
相关产品推荐

