Как проверить, доступна ли необходимая функция Windows API в системе, где запущено приложение? - PullRequest
0 голосов
/ 24 мая 2019

Я хочу использовать некоторые функции Windows API, относящиеся к последним версиям Windows 10 .Например, такие функции, как CreatePseudoConsole(), поддерживающие Windows Pseudo Console (ConPTY) , были представлены только в Windows 10 версии 1809 (осеннее обновление Windows 10 выпущена в 2018 г.).

  • Классический подход заключается в загрузке динамической библиотеки ядра Windows, в которой реализованы необходимые функции (с использованием функции LoadLibrary()) и проверить каждую нужную функцию с помощью GetProcAddress() вызова.
  • Более новый подход, представленный в Visual C ++ 6.0 , называется Задержка загрузки .

Существует ли какой-либо современный (простой, понятный и прозрачный) способ проверить, какие части Windows API доступны для работающего приложения?Или это способ проверить, какая именно версия Windows 10 запущена в приложении?Я хочу использовать такие функции, как CreatePseudoConsole(), только если они доступны (если они недоступны, должен выполняться какой-то другой код).

1 Ответ

1 голос
/ 24 мая 2019

GetProcAddress() - единственный способ сделать то, что вы просите. Определенно НЕ полагайтесь на определение версии ОС (в последних версиях Windows это становится все труднее делать надежно), НЕ полагайтесь на то, существуют ли на самом деле нужные функции.

Даже функция задержки загрузки компоновщика использует GetProcAddress() внутри. В этом случае вы можете использовать хук уведомления о задержке загрузки , чтобы определить результат загрузки, чтобы вы могли соответствующим образом пометить свой код для последующих проверок или даже при необходимости указать указатель на альтернативную резервную функцию.

Эта последняя часть важна, потому что загруженная с задержкой функция не загружается до тех пор, пока она не будет вызвана в первый раз, поэтому, если вы вызываете загруженную с задержкой функцию, которая не существует во время выполнения, и ловушка уведомления не обеспечивает альтернативная функция, ваш код, скорее всего, потерпит крах при попытке выполнить функцию через указатель NULL. Чтобы избежать этого, вы можете просто явно вызвать GetProcAddress(), прежде чем делать какие-либо вызовы функции.

...