首页 > 解决方案 > 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;

}

标签: ccomcodecwic

解决方案


在您的类声明中,您需要从现有接口派生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 的保留。它被定义为没有,所以不要担心。


推荐阅读