2016-10-31 10 views
0

나는 direct2d로 비트 맵을 만들려고했다. 문제는 늘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; 
} 
+4

정의가 작동하지 않습니다. 컴파일되지 않습니까? 당신이 기대하는대로하지 않겠습니까? 맥주를 마시고 토크쇼를 보면서 하루 종일 소파에 누워 있니? – user4581301

+0

어떤 Visual Studio 버전을 사용합니까? 대신'CLSID_WICImagingFactory1' 또는'CLSID_WICImagingFactory2'를 시도하십시오. 나머지 초기화도 표시하십시오. –

+3

컴파일러 오류 또는 런타임 오류가 발생합니까? 후자의 경우,'CoCreateInstance()'가 실제로 리턴하는'HRESULT' 값은 무엇입니까? 그것은 그것이 실패하고있는 이유를 알려줍니다. –

답변

2

이 타격 할 수있는 두 가지 이유가 있습니다 일을 함수를 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에서 발견 DirectXTKWICTextureLoader - 고전에서 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_WINNT0x0601 (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의 차이점에 대한 자세한 내용은 MSDNthis blog post을 참조하십시오.

+0

고맙습니다. 지금 작동합니다. 그러나이 코드 조각은 실제로 읽을 수 없게 보이고 실제로 당신이 거기에서 무엇을했는지 이해하지 못합니다. D –

+0

충분히 공정합니다. 더 많은 설명과 참조로 답변을 업데이트했습니다. 이 코드 스 니펫은 Microsoft에서 많은 사람들이 수년간 코드를 검토 한 결과로, '최고의 제품'이되도록 노력하고 있습니다. –

관련 문제