IWICImagingFactory的CoCreateInstance

时间:2013-02-10 15:15:46

标签: c++ directx direct2d

我在Windows 7计算机上运行Visual Studio 2012。

当我运行此处的SimpleDirect2dApplication:http://technet.microsoft.com/en-us/subscriptions/dd940321%28v=vs.85%29.aspx

    hr = CoCreateInstance(
    CLSID_WICImagingFactory,
    NULL,
    CLSCTX_INPROC_SERVER,
    IID_PPV_ARGS(&m_pWICFactory)
    );

CoCreateInstance失败并显示“未注册类”且出厂的ptr为0。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:0)

根据Microsoft论坛中的answer,Windows SDK 8.0中的重大更改要求您将_WIN32_WINNT定义为0x0600,以向后兼容Windows Vista或{{1} }以便与Windows 7向后兼容。

答案 1 :(得分:0)

这是我用来处理WIC和WIC2场景的WIC创建的代码:

this.MyBrowser.WebBrowser.ExecuteScriptAsyncWhenPageLoaded(@"(async function() {await CefSharp.BindObjectAsync('callbackObj', 'bound');})();");

这将处理从任何线程一次创建工厂的过程。您可以通过以下方式使用它:

namespace
{
    bool g_WIC2 = false;

    BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID *ifactory) noexcept
    {
    #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE)
        HRESULT hr = CoCreateInstance(
            CLSID_WICImagingFactory2,
            nullptr,
            CLSCTX_INPROC_SERVER,
            __uuidof(IWICImagingFactory2),
            ifactory
        );

        if (SUCCEEDED(hr))
        {
            // WIC2 is available on Windows 10, Windows 8.x, and Windows 7 SP1 with KB 2670838 installed
            g_WIC2 = true;
            return TRUE;
        }
        else
        {
            hr = CoCreateInstance(
                CLSID_WICImagingFactory1,
                nullptr,
                CLSCTX_INPROC_SERVER,
                __uuidof(IWICImagingFactory),
                ifactory
            );
            return SUCCEEDED(hr) ? TRUE : FALSE;
        }
    #else
        return SUCCEEDED(CoCreateInstance(
            CLSID_WICImagingFactory,
            nullptr,
            CLSCTX_INPROC_SERVER,
            __uuidof(IWICImagingFactory),
            ifactory)) ? TRUE : FALSE;
    #endif
    }
}

bool IsWIC2() noexcept
{
    return g_WIC2;
}

IWICImagingFactory* GetWIC() noexcept
{
    static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT;

    IWICImagingFactory* factory = nullptr;
    if (!InitOnceExecuteOnce(
        &s_initOnce,
        InitializeWICFactory,
        nullptr,
        reinterpret_cast<LPVOID*>(&factory)))
    {
        return nullptr;
    }
    return factory;
}

对于少数几个关心WIC与WIC2的情况,请使用auto pWIC = GetWIC(); if (!pWIC) // error

IsWIC2

我过去曾使用C ++ 11 lambda编写此代码,但clang / LLVM不太喜欢它。

答案 2 :(得分:-2)

使用此

#if defined(CLSID_WICImagingFactory)
#undef CLSID_WICImagingFactory
#endif

然后你可以通过这个

参见: http://skia.googlecode.com/svn/trunk/src/ports/SkImageDecoder_WIC.cpp