Зависит от видов функций.
Для простых (не COM) функций единственным способом является использование LoadLibrary
и GetProcAddress
. Если любой из них дает сбой, вы знаете, что в ОС отсутствует эта функция. Написание этих объявлений типов указателей функций для указателей функций, дублирующих существующие сигнатуры функций, может быть утомительным, хотя в VC ++ 2010 для этого можно использовать decltype
. Например:
HMODULE user32 = LoadLibraryW(L"user32");
if (user32 != NULL)
{
auto messageBoxW = reinterpret_cast<decltype(MessageBoxW)*>(GetProcAddress(user32, "MessageBoxW"));
if (messageBoxW != NULL)
{
messageBoxW(HWND_DESKTOP, L"Hello!", NULL, MB_OK);
}
}
Однако многие API-интерфейсы оболочки открываются через компоненты и интерфейсы COM. Эти случаи разные. Иногда вам нужно иметь дело с совершенно новыми компонентами; например IApplicationDestinations
- это новый интерфейс в Win7, и coclass, который его реализует, также является новым. В этих случаях вы можете просто сделать CoCreateInstance
и проверить возвращаемое значение для REGDB_E_CLASSNOTREG
- это означает, что такой кокласс не зарегистрирован в системе (и, по сути, не поддерживается).
Иногда, однако, новые версии ОС вводят новые интерфейсы на существующих коклассах. Примером является ITaskbarList3
, новый в Win7, но предоставленный на существующем Coclass, который реализует ITaskbarList
и восходит к Win95. В этих случаях вы должны сначала создать экземпляр класса для самого простого интерфейса, а затем использовать QueryInterface
для получения новых версий интерфейса и обнаружить, что они не поддерживаются, проверив возвращаемое значение для E_NOINTERFACE
.