Составители:
...
PFH_MyFunction pfhMуFunction;
Затем следует получить дескриптор библиотеки, при помощи которого и опреде-
лить адреса функций, например адрес функции с именем MyFunction:
hMyDll=::LoadLibrary("MyDLL");
pfhMyFunction=(PFH_MyFunction)::GetProcAddress(hMyDll,"MyFunction") ;
...
int iCode=(*pfhMyFunction) ("Hello");
В обращении к функции GetProcAddress() следует указывать имя библиотеки и имя
функции. Допускается указание имени процедуры в виде ASCII-строки либо порядково-
го номера (в этом случае для создания библиотеки должен использоваться def-файл,
второй параметр GetProcAddress() приводится к виду MAKEINTRESOURCE(N)). Син-
таксис функции GetProcAddress():
FARPROC GetProcAddress(HMODULE hDLLibrary, LPCSTR lpszProcName);
При успешном завершении функция возвращает адрес точки входа запрашиваемой
процедуры. В противном случае возвращается NULL. Параметры функции:
hDLLibrary - дескриптор DLL, возвращаемый функцией LoadLibrary();
lpszProcName - это либо указатель на завершаемую нулевым символом строку, иденти-
фицирующую процедуру, либо ее порядковый номер.
После завершения работы с библиотекой динамической компоновки, ее можно вы-
грузить из памяти процесса с помощью функции FreeLibrary():
::FreeLibrary(hMyDll);
Рассмотрим часть исходного кода программы подключения DLL с поздним явным
связыванием. В качестве динамической библиотеки используем приведенную выше:
…
typedef int (WINAPI *PFH_MyFunction) (char *);
HINSTANCE hMyDll = LoadLibrary("MyDll.dll");
if (hMyDll )
{
PFH_MyFunction pfhMуFunction =
(PFH_MyFunction)GetProcAddress(hMyDll, "MyFunction" );
if (pfhMуFunction )
int iCode = (*pfhMуFunction)( "Hello!" );
else
MessageBox( NULL, "Cannot find function!", NULL,
MB_OK | MB_ICONASTERISK );
FreeLibrary(hMyDll );
}
else
MessageBox( NULL, "DLL could not be loaded", NULL,
MB_OK | MB_ICONASTERISK );
…
45
...
PFH_MyFunction pfhMуFunction;
Затем следует получить дескриптор библиотеки, при помощи которого и опреде-
лить адреса функций, например адрес функции с именем MyFunction:
hMyDll=::LoadLibrary("MyDLL");
pfhMyFunction=(PFH_MyFunction)::GetProcAddress(hMyDll,"MyFunction") ;
...
int iCode=(*pfhMyFunction) ("Hello");
В обращении к функции GetProcAddress() следует указывать имя библиотеки и имя
функции. Допускается указание имени процедуры в виде ASCII-строки либо порядково-
го номера (в этом случае для создания библиотеки должен использоваться def-файл,
второй параметр GetProcAddress() приводится к виду MAKEINTRESOURCE(N)). Син-
таксис функции GetProcAddress():
FARPROC GetProcAddress(HMODULE hDLLibrary, LPCSTR lpszProcName);
При успешном завершении функция возвращает адрес точки входа запрашиваемой
процедуры. В противном случае возвращается NULL. Параметры функции:
hDLLibrary - дескриптор DLL, возвращаемый функцией LoadLibrary();
lpszProcName - это либо указатель на завершаемую нулевым символом строку, иденти-
фицирующую процедуру, либо ее порядковый номер.
После завершения работы с библиотекой динамической компоновки, ее можно вы-
грузить из памяти процесса с помощью функции FreeLibrary():
::FreeLibrary(hMyDll);
Рассмотрим часть исходного кода программы подключения DLL с поздним явным
связыванием. В качестве динамической библиотеки используем приведенную выше:
…
typedef int (WINAPI *PFH_MyFunction) (char *);
HINSTANCE hMyDll = LoadLibrary("MyDll.dll");
if (hMyDll )
{
PFH_MyFunction pfhMуFunction =
(PFH_MyFunction)GetProcAddress(hMyDll, "MyFunction" );
if (pfhMуFunction )
int iCode = (*pfhMуFunction)( "Hello!" );
else
MessageBox( NULL, "Cannot find function!", NULL,
MB_OK | MB_ICONASTERISK );
FreeLibrary(hMyDll );
}
else
MessageBox( NULL, "DLL could not be loaded", NULL,
MB_OK | MB_ICONASTERISK );
…
45
Страницы
- « первая
- ‹ предыдущая
- …
- 41
- 42
- 43
- 44
- 45
- …
- следующая ›
- последняя »
