Как создать точку входа в библиотеку dll
Функция точки входа для DLL необязательна, но может быть определена. Если эта функция присутствует, операционная система вызывает эту функцию точки входа всякий раз, когда процесс или поток выполнения приложения загружает или выгружает DLL. Эта функция может использоваться для выполнения задач простых инициализации и очистки. Например, эта функция может создать локальное хранилище потока [thread local storage] при создании нового потока и ликвидировать его при завершении работы потока.
Если вы компонуете свою DLL с библиотекой времени выполнения для языка Си [C run-time library] , то эта библиотека времени выполнения может создать функцию точки входа за вас, при этом вы можете написать свою отдельную функцию инициализации. Для более подробной информации об этом читайте документацию по вашей библиотеке времени выполнения [полезная статья по этому вопросу: «Библиотеки DLL и поведение библиотеки времени выполнения Visual C++»] .
Если вы хотите писать свою собственную функцию точки входа, используйте для этого функцию DllMain. Название DllMain является умолчательной заглушкой для функции точки входа, определяемой пользователем. Вы должны указать действительное имя функции точки входа, которое вы используете, при сборке своей DLL. Более подробную информацию об этом ищите в документации, поставляемой с вашими инструментами разработки [полезные статьи по этому вопросу: «Библиотеки DLL и поведение библиотеки времени выполнения Visual C++», «Параметр /ENTRY компоновщика»] .
Ситуации, в которых вызывается функция точки входа
- процесс загружает DLL. Для процессов, использующих динамическое связывание во время запуска программы, DLL загружается во время инициализации процесса. Для процессов, использующих динамическое связывание во время выполнения программы, DLL загружается перед тем, как функция LoadLibrary или LoadLibraryEx возвратит значение [завершит свою работу] ;
- процесс выгружает DLL. DLL выгружается, когда процесс завершается или вызывает функцию FreeLibrary и счетчик ссылок по данной DLL становится равным нулю. Если процесс завершается из-за вызова функций TerminateProcess или TerminateThread, операционная система не вызывает функцию точки входа DLL;
- в процессе, который загрузил DLL, создается новый поток выполнения. Можно использовать функцию DisableThreadLibraryCalls, чтобы отключить уведомления о создании новых потоков выполнения;
- поток выполнения процесса, загрузившего DLL, завершается нормально (то есть не из-за вызова функций TerminateThread или TerminateProcess). Когда процесс выгружает DLL, функция точки входа вызывается только один раз для всего процесса, а не по разу на каждый существующий поток выполнения процесса. Можно использовать функцию DisableThreadLibraryCalls, чтобы отключить уведомления о завершении потоков выполнения.
Операционная система вызывает функцию точки входа в контексте процесса или потока выполнения, ставшего причиной вызова функции. Такой подход разрешает DLL использовать ее функцию точки входа для резервирования памяти в виртуальном адресном пространстве вызывающего процесса или открывать дескрипторы, доступные процессу. Функция точки входа может также резервировать память, которая является собственной [то есть закрытой для других] для нового потока выполнения посредством использования локального хранилища потока [thread local storage (TLS)] . Более подробную информацию о локальном хранилище потока ищите в статье «Локальное хранилище потока».
Написание функции точки входа
- процесс загружает DLL (эта причина вызова функции точки входа DLL обозначается константой DLL_PROCESS_ATTACH );
- текущий процесс создает новый поток выполнения ( DLL_THREAD_ATTACH );
- поток выполнения завершается нормально ( DLL_THREAD_DETACH );
- процесс выгружает DLL ( DLL_PROCESS_DETACH ).
Из-за того, что системная библиотека Kernel32.dll гарантированно будет загружена в адресное пространство процесса, когда вызывается функция точки входа, вызов функций из Kernel32.dll не приведет к тому, что DLL будет использована раньше, чем выполнится код ее инициализации. Поэтому функция точки входа может создавать объекты синхронизации, такие как критические секции и мьютексы, и использовать TLS [локальное хранилище потока] , потому что эти функции размещены в Kernel32.dll . Не является безопасным, к примеру, вызов функций реестра [операционной системы] , потому что они размещены в системной библиотеке Advapi32.dll .
Вызов других функций может привести к проблемам, которые трудно диагностировать. Например, вызов функций [компонентов операционной системы Windows] «User» [функции для работы с пользовательским интерфейсом, окнами] , «Shell» [функции для работы с командной оболочкой операционной системы] и функций COM [Component Object Model, по-русски «модель компонентного объекта»] может послужить причиной ошибок нарушения доступа из-за того, что некоторые функции в их DLL вызывают функцию LoadLibrary, чтобы загрузить другие компоненты операционной системы. И, наоборот, вызов этих функций во время завершения [процесса или потока выполнения] может послужить причиной ошибок нарушения доступа из-за того, что соответствующий компонент мог уже быть выгружен или не инициализирован.
Следующий пример демонстрирует примерную структуру функции точки входа DLL.
Возвращаемое значение функции точки входа
Когда функция точки входа DLL вызывается по причине загрузки процесса, эта функция возвращает значение TRUE, чтобы показать, что она отработала успешно. Для процессов, использующих динамическое связывание во время запуска программы, возврат значения FALSE повлечет за собой неудачу инициализации процесса и его завершение. Для процессов, использующих динамическое связывание во время выполнения программы, возврат значения FALSE повлечет за собой то, что функция LoadLibrary или LoadLibraryEx возвратит значение NULL, указывающее на то, что эта функция свою работу не выполнила по причине некой ошибки. (Операционная система сразу вызовет нашу функцию точки входа с причиной вызова DLL_PROCESS_DETACH и выгрузит DLL.) Возвращаемое значение функции точки входа оставляется без внимания, когда функция вызывается по любой другой причине, кроме DLL_PROCESS_ATTACH.
Для каждой создаваемой DLL вы можете указать точку входа запуска библиотеки, которая обычно автоматически вызывается при каждом подключении или отключении процесса. В то же время, в функции LoadLibraryEx предусмотрена опция, позволяющая подавить вызов точки входа. В случае неявно связываемых (связываемых во время выполнения) библиотек DLL подключение и отключение процесса происходит, соответственно, при его запуске и завершении. В случае же явно связываемых DLL это осуществляется при вызове функций LoadLibrary, LoadLibraryEx и FreeLibrary.
Кроме того, точка входа вызывается всякий раз, когда процесс создает новый поток (глава 7) или прекращает его выполнение.
Точкой входа с именем DllMain, прототип которой приводится ниже, мы воспользуемся в полной мере только в главе 12 (программа 12.4), где она предоставит потокам удобный способ управления ресурсами и так называемыми локальными областями хранения потоков (Thread Local Storage, SLT) в DLL с многопоточной поддержкой.
BOOL DllMain(HINSTANCE hDll, DWORD Reason, LPVOID Reserved)
Параметр hDll является дескриптором экземпляра DLL, возвращенным функцией LoadLibrary. Значение NULL параметра Reserved указывает на то, что подключение процесса к библиотеке произошло в результате вызова функции Load-Library; иные значения этого параметра свидетельствуют о подключении к библиотеке в результате неявного связывания во время загрузки. Подобным образом, к значению NULL параметра Reserved приводит и отключение процесса от библиотеки в результате вызова функции FreeLibrary.
Параметр Reason может иметь одно из четырех значений: DLL_PROCESS_ATTACH, DLL_THREAD_ATTACH, DLL_THREAD_DETACH и DLL_PROCESS_DETACH. Функции точки входа DLL обычно используют операторы switch и в качестве индикатора успешного выполнения возвращают значение TRUE.
Система сериализует вызовы DllMain таким образом, что в каждый момент времени выполнять ее может только один поток (к подробному обсуждению потоков мы приступим в главе 7). Эта сериализация весьма существенна, поскольку операции инициализации, которые должна выполнять DllMain, не должны прерываться до их завершения. По этой же причине внутри точки входа не рекомендуется использовать блокирующие вызовы функций, например, функций ввода/вывода или функций ожидания (см. главу 8), поскольку они будут препятствовать запуску точки входа другими потоками. В частности, не следует вызывать внутри точки входа DLL функции LoadLibrary и LoadLibraryEx, поскольку это будет порождать дополнительные вызовы точек входа DLL.
Функция DisableThreadLibraryCalls отменяет отправку указанному экземпляру DLL уведомлений о подключении и отключении потоков. Запрет отправки уведомлений может пригодиться в тех случаях, когда потоки не нуждаются в каких-либо уникальных ресурсах во время инициализации.
Сценарии входа для всех локальных пользователей
Сценарий входа для одного пользователя
Сценарий входа для одного пользователя Сценарии входа для отдельных пользователей назначаются с помощью оснастки Локальные пользователи и группы (Local users and groups). Замечание В Windows NT для этого использовался Диспетчер пользователей (User Manager for Domain). Для добавления этой
Примеры сценариев входа/выхода
Примеры сценариев входа/выхода Ниже рассмотрены несколько сценариев (два из которых являются обычными командными файлами), которые можно использовать в качестве сценариев входа или
2.1. Выбор способа входа в систему
2.1. Выбор способа входа в систему Для начала работы в Windows Vista нужно выполнить вход в систему с использованием одной из имеющихся в системе учетных записей. По умолчанию для этого используется экран приветствия, где отображаются названия всех учетных записей и их значки
Окно входа в систему
Окно входа в систему Строго говоря этот модуль тоже не часть среды Cinnamon, а является инструментом настройки дисплейного менеджера MDM (изначально аббревиатура Mint Display Manager, ныне превратившаяся в рекурсивное MDM Display Manager), обеспечивающего во всех редакциях дистрибутива Mint
24.2. Изменение фона страницы входа в систему
Новый диалог входа пользователя в систему
Новый диалог входа пользователя в систему В Windows XP появился новый диалог для входа пользователя в систему, применяемый по умолчанию. Если раньше в операционной системе Windows 2000 вас встречало компактное окно для ввода имени пользователя и пароля, то теперь вас ждет красиво
Точка входа в воронку продаж
Точка входа в воронку продаж Точками входа являются страницы сайта, позволяющие пользователю включиться в процесс покупки. Иными словами, точка входа – это дверь (или несколько дверей) в дом, выставленный на продажу. Здесь вы уже можете управлять процессом убеждения и
Варианты входа в Сеть
Варианты входа в Сеть Сегодня существует множество способов подключения к Интернету. Для этого используют следующие средства связи.• Модем – специальное устройство, которое подключается к телефонной розетке; этот доступ еще называется коммутируемым или dial-up.•
3.9. Экран входа в систему. Изменение темы GDM
3.9. Экран входа в систему. Изменение темы GDM При установке Ubuntu вам предлагалось выбрать возможность автоматического входа пользователя в систему. Если вы почему-то этого не сделали, и вам надоело каждый раз вводить свой пароль, выберите конфигуратор Система |
Список пользователей окна входа в систему
Список пользователей окна входа в систему Можно запретить или разрешить отображение определенных учетных записей в диалоге входа в операционную систему. Для этого достаточно воспользоваться параметрами ветви реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows
Настройки входа в систему
Настройки входа в систему Большинство настроек входа в систему хранится в параметрах ветви реестра HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionPoliciesSystem.• VerboseStatus – если значение данного параметра REG_DWORD-типа равно 1, то при входе пользователя в систему (и при завершении работы) будут
1.10.2. Настройки входа в систему
1.10.2. Настройки входа в систему Настройка параметров входа в систему происходит в окне мини-утилиты Учетные записи (Accounts), вызов которой осуществляется из окна Системные настройки (System Preferences). Прежде чем перейти к настройкам, необходимо произвести щелчок мышью на значке
Дополнения точек входа в САС
Дополнения точек входа в САС Международный Союз по телекоммуникациям ввел несколько дополнений точек входа в САС X.509 v2 [78]. Они связывают с точками входа в САС некоторые дополнительные атрибуты. Каждое дополнение может быть помечено как критичное или некритичное.
Ошибка «Запуск программы невозможен, так как на компьютере отсутствует такой-то DLL» является одной из самых распространённых. Возникает оно при установке программного обеспечения, для работы которого требуется динамическая библиотека, как раз отсутствующая на компьютере. Решается проблема установкой соответствующего компонента, содержащего данную DLL, например, Microsoft Visual C++ либо установкой в системы самой библиотеки путём её копирования в папку System32 или SysWOW64 с последующей регистрацией встроенной консольной утилитой regsvr32.exe.
↑ Точка входа DllRegisterServer не найдена
И всё бы хорошо, но в ряде случаев при регистрации библиотеки возникает своя ошибка — «Модуль dll загружен, но точка входа DllRegisterServer не найдена…», при этом в описание предлагается убедиться, что регистрируемый в системе файл является правильным DLL или OCX. Почему возникает эта ошибка? Дело в том, что используемая для регистрации DLL утилита regsvr32.exe при установке библиотеки пробует вызвать из неё функцию DllRegisterServer, которая может и не содержаться в библиотеке. Следствием этого и становится появление ошибки «точка входа DllRegisterServer не найдена».
↑ Использование ключей
Вызов процедуры DllRegisterServer в regsvr32.exe выполняется по умолчанию, однако утилитой поддерживается и другой вызов — DllInstall. Чтобы использовать его при регистрации библиотеки, выполните команду регистрации с ключами «i» и «n», вот так:
Впрочем, этот способ не гарантирует успеха, поскольку функции DllInstall в файле библиотеки так же может не оказаться, в этом случае вы получите ошибку «точка входа DllInstall не найдена».
↑ Установите недостающие компоненты Visual C++
В большинстве случаев библиотеки, отсутствие которых приводит к ошибке установки программ и игр, входят в состав компонентов Visual C++, реже DirectX. Соответственно, решить проблему можно путём установки недостающих версий данных компонентов, причём в случае с Visual C++ для 64-битных систем допустимо использование 32-битных версий компонента.
Способ эффективный, но у него есть и свои недостатки, так, устанавливать те же Visual C++ придётся вслепую. Определить версию компонента, содержащего нужную библиотеку в принципе возможно, вбив в поиск Google или Яндекс запрос «название_библиотеки.dll Visual C++», но это не гарантированное решение.
Установка компонентов Visual C++ — самый надёжный способ установки недостающих и проблемных библиотек, к тому же он безопасный, тогда как скачивая DLL со сторонних ресурсов, вы рискуете загрузить на свой компьютер заражённый файл.
Динамические библиотеки DLL, встраиваемые в Windows, принадлежат к модулям общего пользования (shared library). Отличительные их особенности для пользователя состоят в следующем:
- Функции, прописанные в таких библиотеках, могут использоваться несколькими программами одновременно;
- Загружаются они по запросу соответствующего процесса, то есть динамически, не потребляя без надобности ресурсы ПК.
- При внесении в библиотеку изменений программы, использующие ее могут перестать работать. Этот недочет является излюбленным у распространителей вирусов. Ведь сама Windows функционирует на основе модулей и, повредив их код, можно повлиять на работу ОС.
- При отсутствии библиотеки или ее некорректной версии программа, использующая данный модуль, соответственно, будет либо неправильно функционировать, либо откажется работать.
- Функции, прописанные в библиотеке Dll, получают один адрес в оперативной памяти для всех процессов, вызывающих их, что упрощает эксплуатацию уязвимостей модульного метода организации ПО;
Теперь о том, что такое точка входа. Точкой входа называется адрес в оперативной памяти, по которому хранится первая команда программы. На самом деле, функций в одной библиотеке может быть несколько и каждая из них имеет свою точку входа, к которой и обращается процесс, вызывающий определенную подпрограмму.
Рассмотрев основные причины, по которым возникают неполадки с видимостью ОС библиотеки, можно перейти к путям их разрешения.
Исправляем проблему при которой модуль загружен, но точка входа DLLRegisterServer не найдена
Скачиваем библиотеки dll
Скачивая библиотеки, обязательно вначале уточните разрядность вашей версии Windows (х32/ х64). Если вы найдете и установите неподходящие файлы dll, ошибка “точка входа DLLRegisterServer не найдена” исправлена не будет. Разместите скачанные вручную файлы в папках SysWOW64 и System32, находящихся C:\Windows.
Один очень важный нюанс – при скачивании библиотек dll никогда не пользуйтесь подозрительными ресурсами. Во-первых, данные с таких сайтов могут просто не подойти для вашей ОС (они часто представляют из себя усеченную версию нужного файла), а, во-вторых, вероятнее всего, они содержат вредоносный код, который не только не избавит вас от проблем, но еще и добавит новых. Всегда при малейшем подозрении проверяйте сайт (для этого существуют различные онлайн-сервисы), читайте отзывы и комментарии пользователей. Если скачанный файл dll не работает, возьмите его с другого ресурса.
Регистрируем библиотеки dll
В случае, когда библиотека на компьютере в полном порядке, но точка входа все равно не найдена, попробуем зарегистрировать dll в RegSvr32. Рассмотрим пути избавления от проблемы на основе вышеуказанного изображения. Регистрируем файл thumbcache.dll, находящийся C:\Windows\SysWOW64.
Первый способ – вызвать командную строку и ввести нужные данные:
- нажимаем win+x и находим в появившемся меню командную строку;
- после клика на последнюю появляется черное окно;
- после слова “Компьютер>” вводим слово regsvr32 и через пробел путь к проблемному файлу C:\Windows\SysWOW64\thumbcache.dll.
Нажимаем Enter и ждем окончания процесса регистрации библиотеки. Если данный метод не помогает, попробуйте повторить те же действия, но уже в командной строке от имени администратора. Возможно, вам не хватает прав для внесения изменений в систему.
Второй способ – использовать строку “Выполнить”:
- нажимаем win+r и вызываем нужную нам строку;
- в появившемся поле вводим название файла RegSvr32.exe и путь к отсутствующей библиотеке;
- нажимаем OK и ждем результата.
Устанавливаем обновления для Windows
Способ, к которому можно обращаться уже после того, как вышеуказанные методы не принесли желаемого результата – обновление компонентов вашей ОС. Для этого найдите на своем компьютере Центр обновления. Просмотрите все доступные обновления и прогрузите их. Процесс долгий, но необходимый. Быть может, проблема была в изначально неправильном коде dll-файлов, и разработчики уже нашли решение на своем уровне. Не выключайте соединение с интернетом и сам ПК во время установки обновлений, иначе результата не будет. Убедитесь, что все файлы прогружены и при необходимости повторите операцию.
Часто для исправления ошибки разработчики выпускают различное дополнительное ПО: моды, патчи, пакеты установки. В этом случае найдите и скачайте последнюю версию программного обеспечения, с которым у вас возникли проблемы. И напоследок о крайне нежелательном варианте – переустановке всей Windows. Конечно, этого без надобности не хочется делать никому, но, если система не открывает библиотеку dll, а все вышеуказанные методы уже испробованы, то сносите установленную и ставьте другую сборку ОС (из проверенных источников).
Избавляемся от сбойных обновлений Windows
Рассматриваемая нами ошибка может появляться не только в последней ОС Windows, но и в других версиях. Поэтому, следуя инструкциям, вы сможете устранить эту проблему и на своем ПК с Виндовс XP, 7 или 8.1. Для того, чтобы найти установленные системой обновления, необходимо открыть «Удаление программ».
- В Windows это можно сделать разными способами. Так, как ошибка появляется в разных версиях, выберите подходящий для себя. В ОС 8.1 и 10 вы можете просто выбрать правой кнопкой мыши (ПКМ) значок Windows и нажать на нужный пункт. В других версиях нажмите на «Пуск» и выберите «Панель управления». Если вы затрудняетесь найти этот пункт, воспользуйтесь поиском. Он для этого и существует;
- Если вы перешли в «Панель управления», но пункт «Удаление программ» найти не можете, обратите внимание на строку «Просмотр». Она находится вверху справа над всеми пунктами. Выберите её мышью и установите значение – «Категории»;
- Теперь вы точно увидите здесь раздел «Удаление программ». Выберите его;
- Список программ здесь нам ни к чему, поэтому обратите внимание на пункты слева выше. Здесь будет строка «Просмотр установленных обновлений»;
- Когда вы откроете эту ссылку, перед вами будет список обновлений. Здесь вам нужно найти установленные обновления за последние несколько дней. Определить новые можно по дате их установки. Выбирайте обновления по числу, с которого у вас начались проблемы;
- Чтобы удалить выбранное, нажмите на него указателем мыши и вверху выберите «Удалить»;
- После этих действий необходимо закрыть окна и все приложения и перезагрузить компьютер.
Читайте также: