Во-первых, убедитесь, что вы понимаете, что GetModuleHandle и LoadLibrary не совсем эквивалентны.Но поскольку это не является частью вашего вопроса, я опущу большое объяснение и просто предлагаю вам убедиться, что вы понимаете документацию в этих двух ссылках.
Чтобы использовать функцию dll напрямую, как если быэто было похоже на любую другую функцию, вы не просто включили заголовок.В дополнение к заголовку, где-то в вашем проекте указывается ссылка на соответствующий файл lib.В вашем примере это будет kernel32.lib.Это может быть сделано с помощью различных средств, таких как настройки компоновщика в проекте или наличие #pragma comment (lib, ...)
в файле.
Когда программа построена таким образом, код записывается компилятором для загрузки этой dll, когдапрограмма запускаетсяЕсли указанная dll не может быть найдена, когда вы на самом деле пытаетесь запустить программу, то произойдет сбой с сообщением об ошибке.У вас нет возможности написать код, чтобы перехватить ошибку и предпринять какое-либо альтернативное действие.
Для библиотек DLL, которые являются частью операционной системы (например, kernel32.dll) или, по крайней мере, обычно поставляются с ней, это поведение немедленной загрузкиэто не проблема, так как вы можете с уверенностью предположить, что DLL всегда будет там.С другой стороны, если бы вы строили против dll, которого обычно нет, то у вас было бы больше беспокойства.Либо вам нужно убедиться, что такая dll распространяется с вашей программой, либо попытаться каким-то образом убедиться, что пользователь устанавливает любой другой пакет, необходимый для получения этой dll в своей системе.
Кроме того, если dll загружаетсяно любая из функций, которые вы пытаетесь использовать из этой dll, на самом деле не существует в ней, тогда она сразу же завершится с ошибкой.(Он не ждет, пока ваша программа попытается вызвать функцию. Она обнаруживает это несоответствие, когда программа запускается и затем прерывается.) Это может быть проблемой, если в мире существуют разные версии dll.
Теперь, когда вы используете LoadLibrary / GetProcAddress, вы запрашиваете, чтобы dll загружалась в момент вашего выбора, и просите найти конкретную функцию, предоставляемую этой dll.Если какой-либо из этих шагов завершится неудачей, у вас есть возможность написать код для его разумного решения.
Это можно использовать для различных целей.Например, вы могли бы создать механизм плагинов, где программа ищет и загружает библиотеки плагинов из какой-то конкретной папки на лету.Поскольку программа не знает заранее, какие плагины будут присутствовать, LoadLibrary - единственный способ сделать это.
Еще одна вещь, для которой можно использовать LoadLibrary / GetProcAddress, это загрузить dll и вызвать функцию издаже если у вас нет нужных заголовочных файлов и файлов lib.Если вы знаете имя dll, имя функции и точную сигнатуру функции (типы параметров, тип возврата, соглашение о вызовах), то у вас достаточно написать код для загрузки этой dll и успешного вызова функции.Иногда это может быть полезно.Например, это один из способов, которыми люди могут использовать определенные «недокументированные» функции, предоставляемые Windows-библиотеками Windows.
Наконец, LoadLibrary / GetModuleHandle / GetProcAddress можно использовать, чтобы позволить вам использовать функциональность, которая не обязательно существует навсе операционные системы, которые вы хотите поддерживать.Похоже, это является причиной того, что у вас есть фрагмент кода, который вызывает либо GetNativeSystemInfo , либо GetSystemInfo .Первый доступен только из WinXP / 2003 и выше, а второй доступен в Win2000.Если код был только что написан как прямой вызов GetNativeSystemInfo, то программа не сможет работать в Windows 2000. Но вместо этого то, что у вас есть, проверяет, существует ли GetNativeSystemInfo в текущей операционной системе, и использует его только в таком случае,в противном случае он использует более широко поддерживаемую функцию GetSystemInfo.
Так что в случае вашего примера, какой метод вы выберете для вызова этой функции, зависит от того, какие операционные системы вы намерены поддерживать.Если вашему программному обеспечению не нужно работать в Windows 2000, то просто вызвать GetNativeSystemInfo намного проще (и, скорее всего, это предпочтительный способ).