#include "d3d_helper.h" #include "system_lib.h" #include "error_define.h" #include "log_helper.h" namespace am { typedef HRESULT(WINAPI *DXGI_FUNC_CREATEFACTORY)(REFIID, IDXGIFactory1 **); std::list d3d_helper::get_adapters(int * error, bool free_lib) { std::list adapters; *error = AE_NO; HMODULE hdxgi = load_system_library("dxgi.dll"); if (!hdxgi) { *error = AE_D3D_LOAD_FAILED; return adapters; } do { DXGI_FUNC_CREATEFACTORY create_factory = nullptr; create_factory = (DXGI_FUNC_CREATEFACTORY)GetProcAddress(hdxgi, "CreateDXGIFactory1"); if (create_factory == nullptr) { *error = AE_DXGI_GET_PROC_FAILED; break; } IDXGIFactory1 * dxgi_factory = nullptr; HRESULT hr = create_factory(__uuidof(IDXGIFactory1), &dxgi_factory); if (FAILED(hr)) { *error = AE_DXGI_GET_FACTORY_FAILED; break; } unsigned int i = 0; IDXGIAdapter *adapter = nullptr; while (dxgi_factory->EnumAdapters(i, &adapter) != DXGI_ERROR_NOT_FOUND) { if(adapter) adapters.push_back(adapter); ++i; } dxgi_factory->Release(); } while (0); if (free_lib && hdxgi) free_system_library(hdxgi); return adapters; } }