Определение функции точки входа
Функция точки входа в DLL должна быть объявлена в соответствии с соглашением о вызовах стандартного запроса. Если точка входа DLL объявлена не правильно, DLL не загружается, а система показывает на экране сообщение, указывающее, что точка входа DLL должна быть объявлена с WINAPI.
Windows Me/98/95: Если DLL точка входа объявлена не правильно, DLL не загружается, а система показывает на экране сообщение, с заголовком "Ошибка запуска программы ", которое предписывает пользователю проверить файл, чтобы выяснить проблему.В теле функции, Вы можете обработать любую комбинацию ниже перечисленных сценариев, в котором вызывалась точка входа DLL:
Функция точки входа должна выполнять только простые задачи инициализации. Она не должно вызвать LoadLibrary или функцию LoadLibraryEx (или функцию, которая вызывает эти функции), потому что это может создать циклы взаимозависимости порядка загрузки DLL. Это может в результате привести к использованию DLL, прежде, чем система исполнила код ее инициализации. Точно так же, функция точки входа не должна вызвать функцию FreeLibrary (или функцию, которая вызывает FreeLibrary в ходе обработки кода завершения работы, потому что это действие может привести к использованию DLL после того, как система исполнила код завершения ее работы.
Безопасно вызывать другие функции из Kernel32.dll, потому что эта DLL гарантирует, что загрузка, когда вызывается функция точки входа, будет произведена в адресное пространство процесса. Она является общей для функции точки входа, чтобы создавать объекты синхронизации такие как критические секции и мьютексы (флажки блокировки) и использовать TLS. Не вызывайте функции системного реестра, потому что они расположены в библиотеке Advapi32.dll. Если Вы имеете динамическую связь с C-библиотекой периода выполнения программы, не вызывайте функцию malloc; вместо нее вызовите HeapAlloc.
Вызов импортированных функций, который отличается от вызова функций расположенных в Kernel32.dll, может привести к проблемам, которые трудно диагностировать. Например, вызов функций из библиотек User, Shell и COM может породить ошибки нарушения прав доступа, потому что некоторые функции в этих DLLs вызывают LoadLibrary, чтобы загрузить другие системные компоненты.
Пример ниже демонстрирует, как структурировать функцию точки входа в DLL.
BOOL WINAPI DllMain( HINSTANCE hinstDLL, // дескриптор модуля DLL DWORD fdwReason, // причина для вызова функции LPVOID lpReserved ) // зарезервировано { // Выполняем действия, основанные на причине вызова. switch( fdwReason ) { case DLL_PROCESS_ATTACH: // Однократная инициализация каждого нового процесса. // Возвращает FALSE, чтобы завершить ошибкой загрузку. break; case DLL_THREAD_ATTACH: // Делаем специфическую для потока инициализацию. break; case DLL_THREAD_DETACH: // Делаем специфическую для потока очистку. break; case DLL_PROCESS_DETACH: // Выполняем любую необходимую очистку. break; } return TRUE; // Успешное завершение DLL_PROCESS_ATTACH. } |