c - WIC 编解码器中的函数调用
问题描述
我试图在 c 中创建一个 WIC 编解码器。就我而言,不同接口实现的功能由具有特定名称的它们识别和调用。
在这种情况下,我试图从 IWICBitmapSource 接口实现函数GetPixelFormat 。我试图通过在头文件中初始化函数,然后在源文件中定义主体,并使用 DECLARE_INTERFACE_ 宏将其实现到接口中来实现。
问题是来自 BitmapSource 接口的 GetPixelFormat 函数与来自wingdi.h 文件的函数GetPixelFormat共享它的名称,该函数是 wincodec.h 中的一个包含,这是我首先需要创建该函数的一个包含。
所以总结一下我的问题:
要包含在编解码器接口中的函数是否需要与原始 WIC 接口中的函数名称相同,例如,我的 GetPixelFormat 函数是否需要具有此名称才能被识别为 WIC 函数 GetPixelFormat?
和
如果是:我如何以不会被原始实现干扰的方式实现它?
如果否:我如何以 WIC 将函数识别为 GetPixelFormat 函数的方式将函数实现到接口中?
头文件中的实现示例:
#undef INTERFACE
#define INTERFACE MgfFrameDecoder
DECLARE_INTERFACE_(INTERFACE, IUnknown) {
BEGIN_INTERFACE
STDMETHOD(QueryInterface) (THIS_ REFIID riid, void **ppv) PURE;
STDMETHOD_(ULONG, AddRef) (THIS) PURE;
STDMETHOD_(ULONG, Release) (THIS) PURE;
STDMETHOD(CopyPalette) (THIS_ IWICPalette* pIPalette) PURE;
STDMETHOD(CopyPixels) (THIS_ const WICRect* prc, UINT cbStride, UINT cbBufferSize, BYTE *pbBuffer) PURE;
STDMETHOD(GetPixelFormat) (THIS_ WICPixelFormatGUID* pPixelFormat) PURE;
STDMETHOD(GetResolution) (THIS_ double* pDpiX, double* pDpiY) PURE;
STDMETHOD(GetSize) (THIS_ UINT* puiWidth, UINT* puiHeight) PURE;
STDMETHOD(GetColorContexts) (THIS_ UINT cCount, IWICColorContext** ppIColorContexts, UINT* pcActualCount) PURE;
STDMETHOD(GetMetadataQueryReader) (THIS_ IWICMetadataQueryReader * *ppIMetadataQueryReader) PURE;
STDMETHOD(GetThumbnail) (THIS_ IWICBitmapSource * *ppIThumbnail) PURE;
END_INTERFACE
};
源文件中的实现示例:
static HRESULT STDMETHODCALLTYPE GetPixelFormat(WICPixelFormatGUID* pPixelFormat) {
pPixelFormat = &GUID_WICPixelFormat32bppBGRA;
return S_OK;
}
解决方案
在您的类声明中,您需要从现有接口派生IWICBitmapSource
并删除PURE
宏,因为您实际上是在实现接口,而不是创建接口声明。
class MgfFrameDecoder : public IWICBitmapSource
{
public:
STDMETHOD(QueryInterface) (REFIID riid, void **ppv);
STDMETHOD_(ULONG, AddRef) ();
STDMETHOD_(ULONG, Release) ();
STDMETHOD(GetPixelFormat) (WICPixelFormatGUID* pPixelFormat);
};
在 C++ 中不使用 COM 宏(在 C 和 C++ 中都可以构建)并声明:
class MgfFrameDecoder : public IWICBitmapSource
{
public:
HRESULT __stdcall QueryInterface(IID& riid, LPVOID* ppvObj) override;
HRESULT __stdcall AddRef() override;
HRESULT __stdcall Release() override;
HRESULT __stdcall GetPixelFormat(WICPixelFormatGUID* pPixelFormat) override;
}
在方法体中,static
是不正确的,因为它应该是一个 vtable 条目而不是静态方法。
而是使用:
HRESULT MgfFrameDecoder::GetPixelFormat(WICPixelFormatGUID* pPixelFormat)
{
if (!pPixelFormat)
return E_INVALIDARG;
pPixelFormat = &GUID_WICPixelFormat32bppBGRA;
return S_OK;
}
FAR
是 16 位 Windows 的保留。它被定义为没有,所以不要担心。
推荐阅读
- php - 如何显示 .txt 文件中随机生成的文本和图像?
- jquery - 将值从 jQuery 传递到 Bootstrap modal-body
- scala - Scala:http4s 为在 curl/requests 中工作的相同请求提供 401 Unauthorized
- java - 使用 Java8 Streams API 实现二分搜索
- node.js - 无法将数据从 ionic 保存到 mongodb:MEAN 堆栈
- django - Django Context TypeError:上下文必须是字典而不是上下文
- node.js - 运行 fs-plus 模块时权限被拒绝
- javascript - 在我刷新页面之前,来自图像的输入不会加载(角度 5)
- php - 有一个使用多个数据库的 codeigniter 站点配置?
- javascript - 组件每次渲染调用函数 10 次