이 타격 할 수있는 두 가지 이유가 있습니다 일을 함수를 CoCreateInstance (...)입니다.
(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를 참조하십시오. 코드 DirectXTex에서 발견 DirectXTK의 WICTextureLoader
- 고전에서 Win32 데스크톱 앱
, 당신은 아마 그렇지 않으면 또는 WIC1을 지원하는 플랫폼에 WIC2를 초기화 다음을 사용하고 싶습니다.
#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
를 사용합니다. 이렇게하면 어떤 스레드가 GetWIC
을 먼저 호출하든 상관없이 WIC 팩토리가 정확히 한 번만 생성됩니다. 나는 C++ 11 lambda a.k.a. 익명 함수 인 콜백을 사용하고있다. WIC 팩토리에 대한 실제 포인터는 INIT_ONCE
구조 안에 저장됩니다. Using One-Time Initialization
이 코드는 가능한 모든 플랫폼 설정을 포함하도록 고안되었습니다.
- 다음
_WIN32_WINNT
변수가 나중에 윈도우 8 또는 설정됩니다 윈도우 스토어, 범용 윈도우 플랫폼 (UWP) 애플 리케이션, 또는 X 박스에 대한 건물입니다. 이는 Windows 8.0 이상 만 지원하는 고전적인 Win32 데스크톱 응용 프로그램에도 적용됩니다.
Windows 용 건물 _WIN32_WINNT
은 Windows 8 이하로 설정됩니다. Windows 8.x SDK 및 Windows 10 SDK WIC 헤더는 WIC 및 WIC 버전 2를 모두 지원하지만 WIC 버전 2 정의는 일반적으로 정의되지 않습니다. Windows 7 이하 버전 용으로 빌드합니다. 따라서 빌드 설정에서 _WIN7_PLATFORM_UPDATE
사전 처리기 기호를 사용하여 _WIN32_WINNT
이 0x0601
(Windows 7) 또는 0x0600
(Windows Vista)으로 설정된 경우에도 헤더를 사용하여 WIC2 유형을 정의 할 수 있습니다. 이 경우 WIC2 지원이 운영 체제에 실제로 설치되어 있지 않은 경우와 원래 WIC 공장을 사용하도록 대체해야하는 경우를 처리해야합니다.
그렇지 않으면 WIC 버전 1이 될 기본 WIC 팩토리가 기본값으로 설정됩니다.이 코드 패스는 WIC2 유형이 첫 번째 인 Windows 8.0 SDK보다 이전 Windows SDK로 빌드됩니다 (wincodec.h
). 당신이 공장이 사실에 WIC2 공장 인 경우 특히 당신은 GUID_WICPixelFormat96bppRGBFloat
, GUID_WICPixelFormat32bppRGB
, GUID_WICPixelFormat64bppRGB
, 또는 GUID_WICPixelFormat64bppPRGBAHalf
를 사용하려는 경우, 알 필요가 몇 군데가 있기 때문에
은 내가
IsWIC2
기능이 픽셀 형식. WIC2를 사용하지 않는다면 대신 다른 형식을 사용해야합니다.
WIC와 WIC2의 차이점에 대한 자세한 내용은 MSDN과 this blog post을 참조하십시오.
정의가 작동하지 않습니다. 컴파일되지 않습니까? 당신이 기대하는대로하지 않겠습니까? 맥주를 마시고 토크쇼를 보면서 하루 종일 소파에 누워 있니? – user4581301
어떤 Visual Studio 버전을 사용합니까? 대신'CLSID_WICImagingFactory1' 또는'CLSID_WICImagingFactory2'를 시도하십시오. 나머지 초기화도 표시하십시오. –
컴파일러 오류 또는 런타임 오류가 발생합니까? 후자의 경우,'CoCreateInstance()'가 실제로 리턴하는'HRESULT' 값은 무엇입니까? 그것은 그것이 실패하고있는 이유를 알려줍니다. –