Использование динамической компоновки Run-Time
Вы можете использовать одну и ту же библиотеку DLL в динамическом связывании во время загрузки и во время выполнения. В следующем примере используется функция LoadLibrary для получения дескриптора библиотеки Myputs (см. раздел Создание простой библиотекиDynamic-Link). Если LoadLibrary завершится успешно, программа использует возвращенный дескриптор в функции GetProcAddress, чтобы получить адрес функции myPuts библиотеки DLL. После вызова функции DLL программа вызывает функцию FreeLibrary для выгрузки библиотеки DLL.
Так как программа использует динамическое связывание в режиме выполнения, нет необходимости подключать модуль к импортной библиотеке для DLL.
В этом примере показано важное различие между динамическим связыванием во время выполнения и нагрузкой. Если библиотека DLL недоступна, приложение, использующее динамическое связывание во время загрузки, должно просто завершиться. Однако пример динамического связывания во время выполнения может реагировать на ошибку.
// A simple program that uses LoadLibrary and
// GetProcAddress to access myPuts from Myputs.dll.
#include <windows.h>
#include <stdio.h>
typedef int (__cdecl *MYPROC)(LPCWSTR);
int main( void )
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;
// Get a handle to the DLL module.
hinstLib = LoadLibrary(TEXT("MyPuts.dll"));
// If the handle is valid, try to get the function address.
if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");
// If the function address is valid, call the function.
if (NULL != ProcAdd)
{
fRunTimeLinkSuccess = TRUE;
(ProcAdd) (L"Message sent to the DLL function\n");
}
// Free the DLL module.
fFreeResult = FreeLibrary(hinstLib);
}
// If unable to call the DLL function, use an alternative.
if (! fRunTimeLinkSuccess)
printf("Message printed from executable\n");
return 0;
}
Связанные разделы