Страницы

Поиск по вопросам

четверг, 27 февраля 2020 г.

Почему вызов метода у Com объекта бросает исключение

#c_sharp #net #com


Как известно, что бы узнать кол-во доступных видео адаптеров через интерфейс DXGI,
необходимо вызывать метод EnumAdapters до тех пор, пока данный метод не вернет значение
DXGI_ERROR_NOT_FOUND. 

Казалось бы, будет перечислять через цикл while:

    static void Main(string[] args)
    {
        int result = Manager.CreateDxgiFactory(out IDXGIFactory factory);

        if (result != 0)
        {
            Exception erForHr = Marshal.GetExceptionForHR(result);
            throw erForHr;
        }

        uint count = 0;
        while (factory.EnumAdapters(count, out _) == 0)
        {
            count++;
        }
        ...
    }


Но не тут то было! Как только значение count станет больше чем доступно адаптеров,
получаем исключение...


  Объект не найден. При вызове IDXGIFactory::EnumAdaptes отсутствует
  адаптер с указанным порядковым номером. (Исключение из HRESULT:
  0x887A0002)


Почему, и как платформа .NET обнаруживает то что произошло исключение, если в коде
самостоятельно нигде не бросается исключение?

Как отключить данный функционал, т.к. надо перечислять пока есть доступные адаптеры?

Или необходимо оборачивать код в try/catch и в блоке catch выходить из цикла?
    


Ответы

Ответ 1



COM Interop по умолчанию преобразует все неуспешные возвращенные HRESULT в исключения. Добавьте атрибут PreserveSig, чтобы это предотвратить: [PreserveSig] int EnumAdapters(...);

Комментариев нет:

Отправить комментарий