Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Всем доброго времени суток! Появилась проблема инициализации параметров обычной dll. Но есть нюансы: инициализацию нужно проводить только при загрузке библиотеки, деинициализацию при выгрузке при этом ни в коем случае не использовать dllmain. Уже мозги наизнанку вывернулись. Есть какие идеи?!... Заранее благодарен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 17:27 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnixни в коем случае не использовать dllmain. Обоснуй. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 17:34 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Это чисто технологический процесс Так сделал разработчик основной dll. Я приписал к ней переходник. В описании сказано Код: plaintext 1. И действительно если подцеплять в dllmain все виснет наглухо. А мне нужно контролировать инициализацию/деинициализацию на случай использования этой же dll другими приложениями т.к. повторная инициализация вызывает критический сбой всех приложений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 17:40 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
вот и маюсь не знаю как решить эту заморочку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 17:41 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnixвот и маюсь не знаю как решить эту заморочку Централизуй загрузку и выгрузку этой DLL в приложении. Веди свой собственный счётчик использования и вызывай функции инициализации/деинициализации соответственно этого счётчика. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 18:52 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnixВсем доброго времени суток! Появилась проблема инициализации параметров обычной dll. Но есть нюансы: инициализацию нужно проводить только при загрузке библиотеки, деинициализацию при выгрузке при этом ни в коем случае не использовать dllmain. Уже мозги наизнанку вывернулись. Есть какие идеи?!... Заранее благодарен. Эм... Дело в том, что никак по-другому инициализацию и не выполнить, раньше загрузки и после выгрузки невозможно. Dll main не понятно, чем не угодил, что бы его не использовать. если ты просто объявишь глобальные или статические переменные, то они именно так и будут инициализироваться, как тебе надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 19:55 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnix, Ты просто это неправильно сделал. Почитай еще раз спецификацию на dllmain. Также твое требование может означать и "помести свой код инициализации в dllmain ПОСЛЕ всего моего кода". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 19:59 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
В DllMain нельзя стартовать потоки и процессы. Никаких других ограничений вроде нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 20:39 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ DllMain нельзя стартовать потоки и процессы. Никаких других ограничений вроде нет.Есть. Там самая главная проблема - нельзя звать процедуры которые повлекут за собой подгрузку других dll. http://msdn.microsoft.com/en-us/library/windows/desktop/ms682583%28v=vs.85%29.aspx The entry-point function should perform only simple initialization or termination tasks. It must not call the LoadLibrary or LoadLibraryEx function (or a function that calls these functions), because this may create dependency loops in the DLL load order. This can result in a DLL being used before the system has executed its initialization code. Similarly, the entry-point function must not call the FreeLibrary function (or a function that calls FreeLibrary) during process termination, because this can result in a DLL being used after the system has executed its termination code. Because Kernel32.dll is guaranteed to be loaded in the process address space when the entry-point function is called, calling functions in Kernel32.dll does not result in the DLL being used before its initialization code has been executed. Therefore, the entry-point function can call functions in Kernel32.dll that do not load other DLLs. For example, DllMain can create synchronization objects such as critical sections and mutexes, and use TLS. Unfortunately, there is not a comprehensive list of safe functions in Kernel32.dll. Calling functions that require DLLs other than Kernel32.dll may result in problems that are difficult to diagnose. For example, calling User, Shell, and COM functions can cause access violation errors, because some functions load other system components. Conversely, calling functions such as these during termination can cause access violation errors because the corresponding component may already have been unloaded or uninitialized. Because DLL notifications are serialized, entry-point functions should not attempt to communicate with other threads or processes. Deadlocks may occur as a result. В общем, функции init()/finish() это наше все :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2013, 21:29 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyВ DllMain нельзя стартовать потоки и процессы. Никаких других ограничений вроде нет.нет? http://www.microsoft.com/whdc/driver/kernel/DLL_bestprac.mspx всего-тоYou should never perform the following tasks from within DllMain: • Call LoadLibrary or LoadLibraryEx (either directly or indirectly). This can cause a deadlock or a crash. • Synchronize with other threads. This can cause a deadlock. • Acquire a synchronization object that is owned by code that is waiting to acquire the loader lock. This can cause a deadlock. • Initialize COM threads by using CoInitializeEx. Under certain conditions, this function can call LoadLibraryEx. • Call the registry functions. These functions are implemented in Advapi32.dll. If Advapi32.dll is not initialized before your DLL, the DLL can access uninitialized memory and cause the process to crash. • Call CreateProces. Creating a process can load another DLL. • Call ExitThread. Exiting a thread during DLL detach can cause the loader lock to be acquired again, causing a deadlock or a crash. • Call CreateThread. Creating a thread can work if you do not synchronize with other threads, but it is risky. • Create a named pipe or other named object (Windows 2000 only). In Windows 2000, named objects are provided by the Terminal Services DLL. If this DLL is not initialized, calls to the DLL can cause the process to crash. • Use the memory management function from the dynamic C Run-Time (CRT). If the CRT DLL is not initialized, calls to these functions can cause the process to crash. • Call functions in User32.dll or Gdi32.dll. Some functions load another DLL, which may not be initialized. • Use managed code. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 07:37 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Буду разбираться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 12:58 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Кстати попутно возник вопрос, а как корректно вызывать dll из dll. Самый корректный вариант есть? Или каждый как считает нужным так и делает ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 13:53 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnixа как корректно вызывать dll из dll. Существует всего два способа использования DLL: статический и динамический. Который из них ты считаешь некорректным применять в другой DLL и почему? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:09 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
наверно не правильно задал вопрос, статический и динамический это понятно, но помимо этих двух способов есть какие то нюансы или все придерживается только этих двух правил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:11 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
lnix есть какие то нюансы?освобождать память только там где она выделена передавать только POD типы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 14:29 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Проблему решил. Благодарю всех за участие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 15:02 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovlnixа как корректно вызывать dll из dll. Существует всего два способа использования DLL: статический и динамический. Который из них ты считаешь некорректным применять в другой DLL и почему? На самом деле есть только один способ -- динамический. Статический -- это способ сказать линкеру и дать ему нужную информацию, чтобы он сгенерировал код по динамической загрузке библиотеки и вызвал его в нужный момент (есть кстати и отложенная статическая линковка .DLL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 15:15 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
MasterZivСтатический -- это способ сказать линкеру и дать ему нужную информацию, чтобы он сгенерировал код по динамической загрузке библиотеки и вызвал его в нужный момент Хочешь сказать, что в каждом EXE есть код чтения таблицы импорта и загрузки перечисленных там библиотек?.. А, может, этой неблагодарной работой всё же занимается системный загрузчик?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.02.2013, 15:18 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMasterZivСтатический -- это способ сказать линкеру и дать ему нужную информацию, чтобы он сгенерировал код по динамической загрузке библиотеки и вызвал его в нужный момент Хочешь сказать, что в каждом EXE есть код чтения таблицы импорта и загрузки перечисленных там библиотек?.. А, может, этой неблагодарной работой всё же занимается системный загрузчик?.. Загрузчика в винде нет. Это всё делает линкер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 10:28 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
MasterZivЗагрузчика в винде нет. Это всё делает линкер. Который? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.02.2013, 13:57 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
MasterZivНа самом деле есть только один способ -- динамический. Статический -- это способ сказать линкеру и дать ему нужную информацию, чтобы он сгенерировал код по динамической загрузке библиотеки и вызвал его в нужный момент (есть кстати и отложенная статическая линковка .DLL).интересно как этому сгенерированому коду удается загрузить kernel32.dll ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:38 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
?MasterZivНа самом деле есть только один способ -- динамический. Статический -- это способ сказать линкеру и дать ему нужную информацию, чтобы он сгенерировал код по динамической загрузке библиотеки и вызвал его в нужный момент (есть кстати и отложенная статическая линковка .DLL).интересно как этому сгенерированому коду удается загрузить kernel32.dllkernel32 загружен всегда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 19:05 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
White Owlkernel32 загружен всегда.Кто же его загружает, если MasterZiv Загрузчика в винде нет? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 07:45 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
MasterZivDimitry Sibiryakovпропущено... Хочешь сказать, что в каждом EXE есть код чтения таблицы импорта и загрузки перечисленных там библиотек?.. А, может, этой неблагодарной работой всё же занимается системный загрузчик?.. Загрузчика в винде нет. Это всё делает линкер.Джеффри РИХТЕР "WINDOWS Создание эффективных WIN32-приложений с учетом специфики 64-разрядной версии Windows": Выполнение ЕХЕ-модуля При запуске ЕХЕ-файла загрузчик операционной системы создает для его процесса виртуальное адресное пространство и проецирует на него исполняемый модуль Далее загрузчик анализирует раздел импорта и пытается спроецировать все необходимые DLL на адресное пространство процесса Поскольку в разделе импорта указано только имя DLL (без пути), загрузчику приходится самому искать ее ня дисковых устройствах в компьютере пользователя. Поиск DLL осуществляется в следующей последовательности. Каталог, содержащий ЕХЕ-файл. Текущий каталог процесса. Системный каталог Windows Основной каталог Windows Каталоги, указанные в переменной окружения PATH. Учтите, что на процесс поиска библиотек могут повлиять и другие факторы (см. главу 20) Проецируя DLL-модули на адресное пространство, загрузчик проверяет в каждом из них раздел импорта. Если у DLL есть раздел импорта (что обычно и бывает), загрузчик проецирует следующий DLL-модуль При этом загрузчик ведет учет загружаемых DLL и проецирует их только один раз, даже если загрузки этих DLL требуют идругие модули. Если найти файл DLL не удается, загрузчик выводит одно из двух сообщений (первое — в Windows 2000, а второе — в Windows 98). Найдя и спроецировав на адресное пространство процесса все необходимые DLLмодули, загрузчик настраивает ссылки на импортируемые идентификаторы. Для этого он вновь просматривает разделы импорта в каждом модуле, проверяя наличие указанного идентификатора в соответствующей ULL Не обнаружив его (что происходит крайне редко), загрузчик выводит одно из двух сообщений (первое — в Windows 2000, а второе — в Windows 98): Было бы неплохо, если бы в версии этого окна для Windows 2000 сообщалось имя недостающей функции, а нс маловразумительный для пользователя код ошибки вроде 0xC000007B. Ну да ладно, может, в следующей версии Windows это будет исправлено. Если же идентификатор найден, загрузчик отыскивает его RVA и прибавляет к виртуальному адресу, по которому данная DLL размещена в адресном пространстве процесса, а затем сохраняет полученный виртуальный адрес в разделе импорта EXEмодуля. И с этого момента ссылка в коде на импортируемый идентификатор приводит к выборке его адреса из раздела импорта вызывающего модуля, открывая таким образом доступ к импортируемой переменной, функции или функции-члену C++класса. Вот и все — динамические связи установлены, первичный поток процесса начал выполняться, и приложение наконец-то работает! Естественно, загрузка всех этих DLL и настройка ссылок занимает какое-то время. Но, поскольку такие операции выполняются лишь при запуске процесса, на производительности приложения это не сказывается Тем не менее для многих программ подобная задержка при инициализации неприемлема. Чтобы сократить время загруз- ки приложения, Вы должны модифицировать базовые адреса своих EXE- и DLL-модулей и провести их (модулей) связывание. Увы, лишь немногие разработчики знают, как это делается, хотя эти приемы очень важны. Если бы ими пользовались всс компании-разработчики, система работала бы куда быстрее. Я даже считаю, что операционную систему нужно поставлять с утилитой, позволяющей автоматически выполнять эти операции О модификации базовых адресов модулей и о связывании я расскажу в следующей главе ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 08:19 |
|
||
|
Инициализация dll
|
|||
|---|---|---|---|
|
#18+
White Owlkernel32 загружен всегдаЭто вообще-то неверно. Для программ использующих Native_API kernel32 может быть и не загружен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.02.2013, 08:21 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=38158099&tid=2020430]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
153ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
1ms |
| others: | 15ms |
| total: | 268ms |

| 0 / 0 |
