1

我在我的 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。

任何帮助,将不胜感激。

4

3 回答 3

0

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

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;
}

这处理从任何线程创建一次工厂。您只需调用即可使用它:

auto pWIC = GetWIC();
if (!pWIC)
    // error

对于您关心 WIC 与 WIC2 的少数情况,您可以使用IsWIC2

if (targetFormat && memcmp(&guidContainerFormat, &GUID_ContainerFormatBmp, sizeof(WICPixelFormatGUID)) == 0 && IsWIC2())
{
    // Opt-in to the WIC2 support for writing 32-bit Windows BMP files with an alpha channel
    PROPBAG2 option = {};
    option.pstrName = const_cast<wchar_t*>(L"EnableV5Header32bppBGRA");

    VARIANT varValue;
    varValue.vt = VT_BOOL;
    varValue.boolVal = VARIANT_TRUE;
    (void)props->Write(1, &option, &varValue);
}

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

于 2020-04-20T07:51:31.160 回答
0

根据 Microsoft 论坛中的回答,Windows SDK 8.0 的重大更改要求您定义_WIN32_WINNT0x0600向后兼容 Windows Vista 或0x0601向后兼容 Windows 7。

于 2019-01-21T16:05:33.853 回答
-2

使用这个

#if defined(CLSID_WICImagingFactory)
#undef CLSID_WICImagingFactory
#endif

然后你可以通过这个

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

于 2014-01-23T03:56:34.553 回答