E_NOINTERFACE при вызове CreateDXGIFactory1

Я относительно новичок в C++ в целом и очень новичок в разработке для Windows.

Я пишу программу, которая использует библиотеку DXGI — она прекрасно компилируется, но когда я запускаю исполняемый файл, HRESULT из CreateDXGIFactory1 выходит как 0x80004002 или E_NOINTERFACE.

Я пропустил какую-то библиотеку, или здесь есть более глубокая проблема?

Код, который я использую, выглядит следующим образом:

Вывод: «Ошибка: 0x80004002».

  //Initialize a UUID
  GUID uuid;
  HRESULT hCreateUUID = CoCreateGuid(&uuid);

  //Convert the UUID to string
  LPOLESTR stringUUID;
  HRESULT hStringToUUID = StringFromCLSID(uuid, &stringUUID);

  //Initialize the factory pointer
  IDXGIFactory1* pFactory;

  //Actually create it
  HRESULT hCreateFactory = CreateDXGIFactory1(uuid, (void**)(&pFactory));
  if (hCreateFactory == S_OK) {
    printf("Factory creation was a success\n");
  } else {
    printf("ERROR: 0x%X\n", hCreateFactory);
  }

person javanix    schedule 25.07.2013    source источник


Ответы (1)


Вы передаете случайно созданный GUID. Это не имеет никакого смысла. Вы должны передать IID интерфейса, который хотите получить, а именно __uuidof(IDXGIFactory1). Пример в документации показывает именно это.

person Igor Tandetnik    schedule 25.07.2013
comment
Спасибо, только сейчас это заметил. Откуда взялась функция __uuid, просто из любопытства? - person javanix; 25.07.2013
comment
Это не функция, это специальный (нестандартный, специфичный для Microsoft) оператор, чем-то похожий на sizeof или typeid. Он читает аннотацию, прикрепленную к типу через __declspec(uuid), который, в свою очередь, является нестандартным декларатором Microsoft. Если вы посмотрите, как IDXGIFactory1 определяется в системных заголовках, вы увидите __declspec(uuid) (обычно скрыто за макросом, так что придется немного покопаться). - person Igor Tandetnik; 25.07.2013