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