Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Явное подключение экспортируемого идентификатора



Поток получает адрес экспортируемого идентификатора из явно загружаемой DLL вызовом GetProcAddress:

FARPROC GetProcAddress(HINSTANCE hinstDll, PCSTR pszSymbolName);

Параметр hinstDll – описатель, возвращенный LoadLibrary или GetModuleHandle и относящийся к DLL, которая содержит нужный идентификатор

Параметр pszSumbolName разрешается указывать в двух формах.

Во-первых, как адрес строки с нулевым символом в конце, содержащей имя интересующей нас функции:

FARPROC pfn = GetProcAddress (hinstDll, ”SomeFuncInDll”);

Тип PCSTR указывает, что функция GetProcAddress принимает только ANSI строки. Идентификаторы функций и переменных в разделе экспорта DLL всегда хранятся как ASCII-строки

Вторая форма параметра pszSumbolName позволяет указывать порядковый номер нужной функции:

FARPROC pfn = GetProcAddress (hinstDll, MAKEINTRESOURSE(2));

Здесь подразумевается, что нам известен порядковый номер (2) искомого идентификатора, присвоенный ему автором данной DLL. Microsoft не рекомендует пользоваться порядковыми номерами.

Функции ввода/вывода

В DLL может быть лишь одна функция ввода/вывода. Система вызывает ее в информационных целях, и обычно она используется DLL для инициализации и очистки ресурсов в конкеретных процессах и потоках. Если вашей DLL подобные уведомления не нужны, эту функцию можно не использовать (Пример – DLL, содержащая только ресурсы)

Пример использования функции:

BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, PVOID fImpLoad){

switch (fwReason){

case DLL_PROCESS_ATTACH:

//DLL проецируется на адресное пространство процесса

break;

case DLL_THREAD_ATTACH:

//создается поток

break;

case DLL_THREAD_DETACH:

//поток корректно завершается

break;

case DLL_PROCESS_DETACH:

//DLL отключается от адресного пространство процесса

break;

}

return(TRUE); //используется только для DLL_PROCESS_ATTACH

Параметр hinstDll - описатель экземпляра DLL. (Виртуальный адрес проекции файла DLL на адресное пространство процесса)

Параметр fImpLoad – отличен от 0, если DLL загружена неявно, и равен 0, если DLL загружена явно.

Параметр fdwReason – сообщает о причине, по которой система вызвала эту функцию. Он принимает одно из значений: DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH

В документации Platform SDK утверждается, что DllMain должна выполнять лишь простые виды инициализации – настройку локальной памяти потока, создание объектов ядра, открытие файлов и т.д.

Из DllMain функции нельзя вызывать LoadLibrary(Ex) и FreeLibrary, так как это может привести к взаимной блокировке.

Нужно избегать обращений из DllMain к функциям, импортируемым их других DLL [kgl].

Основная литература: [1] – 158 - 166 c, [2] – 475-526 c.

Контрольные вопросы:

  1. Как создается DLL модуль?
  2. Для чего используются разделы экспорта и импорта?
  3. Как создается EXE модуль, импортирующий идентификаторы из DLL?

[gl] Лекция 10. Тема: Использование файловой системы [:]

Файлами обычно называют взаимосвязанные блоки данных на запоминающем устройстве, обозначенные именем, а в API Win32 файлами считают именованные каналы, ресурсы связи, дисковые устройства, потоки ввода или вывода на консоль или обычные файлы. По принципу организации все эти типы файлов являются одинаковыми, но отличаются друг от друга своими дополнительными свойствами и ограничениями. Файловые функции API Win32 позволяют приложениям получать доступ к файлам независимо от основополагающей файловой системы или типа устройства. Однака предоставляемые при этом возможности зависят от файловой системы, устройства или операционной системы.





Дата публикования: 2015-11-01; Прочитано: 333 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...