#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(...);
Комментариев нет:
Отправить комментарий