Перевод с английского статьи от 31.05.2018 г. «Dynamic-Link Library Entry-Point Function»:
https://docs.microsoft.com/ru-ru/windows/win32/dlls/dynamic-link-library-entry-point-function
(На данный момент на этом сайте нет перевода этой статьи на русский, есть только версия на английском.)
Функция точки входа для 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 должна быть объявлена с применением соглашения о вызове stdcall [для операционных систем компании Microsoft — __stdcall] . Если точка входа DLL не будет объявлена правильно, DLL не загрузится, а операционная система выдаст сообщение, указывающее, что точка входа DLL должна быть объявлена с применением макроса WINAPI .
- процесс загружает 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.
BOOL WINAPI DllMain( HINSTANCE hinstDLL, // дескриптор модуля DLL DWORD fdwReason, // причина вызова функции LPVOID lpReserved ) // параметр с дополнительной информацией < // выполнить некие действия в зависимости от причины вызова функции switch( fdwReason ) < case DLL_PROCESS_ATTACH: // инициализация для каждого нового процесса; // возврат значения FALSE, если не получается загрузить DLL break; case DLL_THREAD_ATTACH: // выполнить инициализацию для потока выполнения break; case DLL_THREAD_DETACH: // произвести очистку для потока выполнения break; case DLL_PROCESS_DETACH: // выполнить любую необходимую очистку break; > return TRUE; // успешная отработка функции по причине DLL_PROCESS_ATTACH >
Возвращаемое значение функции точки входа
Когда функция точки входа DLL вызывается по причине загрузки процесса, эта функция возвращает значение TRUE, чтобы показать, что она отработала успешно. Для процессов, использующих динамическое связывание во время запуска программы, возврат значения FALSE повлечет за собой неудачу инициализации процесса и его завершение. Для процессов, использующих динамическое связывание во время выполнения программы, возврат значения FALSE повлечет за собой то, что функция LoadLibrary или LoadLibraryEx возвратит значение NULL, указывающее на то, что эта функция свою работу не выполнила по причине некой ошибки. (Операционная система сразу вызовет нашу функцию точки входа с причиной вызова DLL_PROCESS_DETACH и выгрузит DLL.) Возвращаемое значение функции точки входа оставляется без внимания, когда функция вызывается по любой другой причине, кроме DLL_PROCESS_ATTACH.
Источник: ilyachalov.livejournal.com
Как найти точку входа приложения в Visual Studio (C ++)
Вопрос может относиться к любому языку программирования, написанному в Visual Studio, но я больше обеспокоен C ++.
Есть ли способ легко определить точку входа приложения в Visual Studio?
Для относительно небольших приложений это может быть легко, но для больших это будет довольно сложно. В моем конкретном случае я знаю, что проект, который установлен как автозагрузка, имеет точку входа, но я не смог ее найти, даже приложение запускается и работает хорошо.
Решение
При желании стоп выполнение в верхней части функции main / WinMain во время интерактивной отладки процесса в Windows, я обычно просто использую F10 / F11 (при условии привязки клавиш C / C ++ по умолчанию в IDE Visual Studio), чтобы дать команду отладчику на одношаговое выполнение (которое запускается процесс, затем выполняет шаг, затем прерывается).
Обратите внимание, что это не всегда может делать то, что вы хотите. Если вы хотите отловить глобальные инициализации, конструкции объектов и т. Д., Это уже сделано до того, как main или же WinMain , Это требует дополнительной отладки и установки точек останова в исходном коде CRT для реальный глобальный код запуска (который в конечном итоге вызывает ваш main или же WinMain ). Но если вы просто хотите выполнить вход по основной программе для программы, созданной с помощью символов отладки, это, вероятно, самый простой способ сделать это.
Другие решения
В C ++ полностью скомпилированная программа может иметь только одну определенную main метод. Если их больше одного, компилятор будет жаловаться на «множественные определения основного» или какое-либо другое сообщение с аналогичной формулировкой.
Итак, самый простой вариант — поиск символа main (или, если компилируется как программа подсистемы Windows, WinMain ) и выяснить, какие из них соответствуют проекту «запуска». Там не должно быть так много, даже в относительно большом решении.
Если вы хотите найти исполняемый проект C ++, тогда ищите Application во всех ваших *.vcxproj файлы.
Если вы ищете функцию точки входа внутри этого приложения, чем искать main , wmain или же WinMain функции.
Также точка входа может быть переопределена с помощью /ENTRY параметр, так что вы можете проверить Configuration Properties > Linker > Advanced > Entry Point параметр проекта или поиск /ENTRY в вашем *.vcxproj ,
Источник: web-answers.ru
Точка входа
Точка входа (англ. Entry Point (EP) — точка входа) — адрес в оперативной памяти, с которого начинается выполнение программы. Другими словами — адрес, по которому хранится первая команда программы.
Однако не надо путать её с «первыми командами» программы на языке высокого уровня. Например, программа на C++ начинается с функции main() . На самом деле, выполнение такой программы происходит далеко не с первой команды этой функции: точка входа в программу будет находиться в библиотеке времени исполнения «C runtime», а процедура main() назначится точкой входа в пользовательский код.
Оригинальной точкой входа называют адрес, с которого начинает выполняться упакованная программа после завершения работы распаковщика (хотя распаковка может быть завершена не полностью). [1]
В web-программировании также используется термин «точка входа». Так называется скрипт, с которого начинается генерация HTML-страницы. Большая часть динамических интернет-страниц реализована на PHP, а сервер позволяет выполнить любой из php-файлов лежащих в заданном каталоге. В этом случае получается, что сайт имеет множество точек входа.
В этой связи появилась концепция единой точки входа, когда сервер (например, Apache) принудительно отправляет все запросы к одному скрипту, как правило, это index.php в корневом каталоге сайта. А далее index.php, анализируя параметры запроса, определяет, какие ещё файлы нужно подключить, что нужно выполнить.
Часто у сайта делают две точки входа: одна для посетителей и одна для входа в административную часть. Первая, например, обрабатывается через index.php корневого каталога, а вторая — в /administrator/index.php .
Источник: wiki2.org