CoCreateInstance不起作用

时间:2016-10-31 23:58:23

标签: c++ com wic

我尝试用direct2d创建一个Bitmap。 问题是CoCreateInstance(...)它不起作用的功能

 HRESULT Renderer::InitImagingFactory()
{
    if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED))) return E_FAIL;


    if (FAILED(CoCreateInstance(
        CLSID_WICImagingFactory,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_IWICImagingFactory,
        reinterpret_cast<void **>(&m_imagingfactory)))) return E_FAIL;

    return S_OK;
}

1 个答案:

答案 0 :(得分:2)

有两个主要原因可以解决这个问题。

(1)您需要在调用此函数之前初始化COM。对于经典的Win32桌面应用,您可以使用CoInitializeCoInitializeEx执行此操作。对于Windows运行时平台,您可以使用Windows::Foundation::Initialize

HRESULT hr = CoInitializeEx(nullptr, COINITBASE_MULTITHREADED);
if (FAILED(hr))
    // error

(2)您需要确保为目标平台正确设置_WIN32_WINNT - 请参阅Using the Windows Headers

对于经典的Win32桌面应用,您可能希望使用以下内容在支持它的平台上初始化WIC2,否则在WIC1上初始化WIC2 - DirectXTexDirectXTK&#39; s中的代码{ {1}}。

WICTextureLoader
  

这使用#include <wincodec.h> namespace { bool g_WIC2 = false; } bool IsWIC2() { return g_WIC2; } IWICImagingFactory* GetWIC() { static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory* factory = nullptr; InitOnceExecuteOnce(&s_initOnce, [](PINIT_ONCE, PVOID, PVOID *factory) -> BOOL { #if (_WIN32_WINNT >= _WIN32_WINNT_WIN8) || defined(_WIN7_PLATFORM_UPDATE) HRESULT hr = CoCreateInstance( CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), factory ); 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), factory ); return SUCCEEDED(hr) ? TRUE : FALSE; } #else return SUCCEEDED( CoCreateInstance( CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), factory) ) ? TRUE : FALSE; #endif }, nullptr, reinterpret_cast<LPVOID*>(&factory)); return factory; } 来确保它的线程安全。这确保无论哪个线程首先调用InitOnceExecuteOnce,都只创建一次WIC工厂。我使用C ++ 11 lambda a.k.a.和匿名函数进行回调。指向WIC工厂的实际指针存储在GetWIC结构中。见Using One-Time Initialization

此代码旨在涵盖所有可能的平台设置。

  • 在为Windows应用商店,通用Windows平台(UWP)应用或Xbox构建时,将为Windows 8或更高版本设置INIT_ONCE变量。这也适用于仅支持Windows 8.0或更高版本的经典Win32桌面应用程序。

  • 为Windows 7构建时_WIN32_WINNT将设置为Windows 8以下版本.Windows 8.x SDK和Windows 10 SDK WIC标头支持WIC和WIC版本2,但WIC版本2通常不为Windows 7或更低版​​本定义定义。因此,您还可以在构建设置中使用_WIN32_WINNT预处理器符号来获取_WIN7_PLATFORM_UPDATE标头以定义WIC2类型,即使wincodec.h设置为_WIN32_WINNT(Windows 7)或0x0601(Windows Vista)。在这种情况下,您需要处理操作系统上实际未安装WIC2支持并回退以使用原始WIC工厂的情况。

  • 否则,它只是默认为WIC版本1的默认WIC工厂。此代码路径也将使用比Windows 8.0 SDK更旧的Windows SDK构建,这是第一个具有WIC2类型的版本。 {1}}。

我有0x0600功能,因为有些地方你需要知道工厂是否实际上是WIC2工厂,特别是如果你试图使用wincodec.h,{{ 1}},IsWIC2GUID_WICPixelFormat96bppRGBFloat像素格式。如果您没有使用WIC2,那么您需要使用其他格式。

有关WIC与WIC2的不同之处的详细信息,请参阅MSDN以及this blog post