我尝试用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;
}
答案 0 :(得分:2)
有两个主要原因可以解决这个问题。
(1)您需要在调用此函数之前初始化COM。对于经典的Win32桌面应用,您可以使用CoInitialize
或CoInitializeEx
执行此操作。对于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 - DirectXTex和DirectXTK&#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}},IsWIC2
或GUID_WICPixelFormat96bppRGBFloat
像素格式。如果您没有使用WIC2,那么您需要使用其他格式。
有关WIC与WIC2的不同之处的详细信息,请参阅MSDN以及this blog post。