Операционные системы. Учебное пособие. Марапулец Ю.В. - 43 стр.

UptoLike

Составители: 

...
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