Аннотация:
В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.
ДЫК ОНА НЕ ВСЯ.
КОГДА ДОПИШИТЕ ТОГДА И ВЫКЛАДЫВАЙТЕ!!!
АС>Статья:
АС>Авторы: АС> Андрей Солодовников
АС>Аннотация: АС>В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.
Всем привет.
BTW, по адресу http://gzip.rsdn.ru/File/8583/delayimphlp.zip лежит немного обновленная версия исходников библиотеки. Пофикшен маленький баг с UNICODE и добавлена возможность пользовать функции без параметров. Насчет того, надо ли обновлять исходники, выложенные тут — я не знаю. В принципе, особой ценности внесенные изменения не несут, хотя. В общем, просто уведомляю, что есть более свежий вариант исходников — решать вам...
АС>Авторы: АС> Андрей Солодовников
АС>Аннотация: АС>В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.
Спасибо Андрею за отличную статью. А где бы еще почитать о шаблонах проектирования и реализации плагинов?
Re: Реализация отложенной загрузки библиотек на С++
АС>Авторы: АС> Андрей Солодовников
АС>Аннотация: АС>В данной статье описывается способ реализации отложенной загрузки динамических библиотек на С++ без использования механизма delayload, приведена реализация библиотеки отложенной загрузки и пример ее использования.
Re[2]: Реализация отложенной загрузки библиотек на С++
R>Nazvanie stat'i ne korrektnoe. R>Code kishit MS-Specifichnymi Funkcijami. R>MSVC++ != C++
А можно хотя бы один пример специфичной для компиляторов от m$ функции C++, используемой в статье? Платформенно-зависимые аспекты, ессно, тут включать в это не надо — функционал ориентирован на использование в среде win32.
PS Правилами сайта использование транслита крайне деприкейтед. В следующий раз для удобства читающих большая просьба — пользуйтесь услугами соотв. сайтов-переводчиков с транслита.
Здравствуйте, Andrew S, Вы писали:
R>>Nazvanie stat'i ne korrektnoe. R>>Code kishit MS-Specifichnymi Funkcijami. R>>MSVC++ != C++
AS>А можно хотя бы один пример специфичной для компиляторов от m$ функции C++,
Вот например: GetModuleHandle
Буду благодарен за аналогию в UNIX-е
AS>функционал ориентирован на использование в среде win32.
Как можно большая независимость от компилятора С++ (в пределах ANSI C++).
...
библиотека должна быть полностью функциональна на всех Visual C++ компиляторах
==
MSWord: Мултиплатформенное приложение, рапотает на Win98/W2K/XP
Re[4]: Реализация отложенной загрузки библиотек на С++
AS>>А можно хотя бы один пример специфичной для компиляторов от m$ функции C++,
R>Вот например: GetModuleHandle R>Буду благодарен за аналогию в UNIX-е
1. Где в статье хоть слово про мультиплатформенность? Там есть про соответствие библиотеки нормам анси С++.
2. Каким образом GetModuleHandle является спецификой m$ компилятора? Что, в Borland C++ или в комеау под win32 ее нет? Эта функция является спецификой среды, и тут никуда от этого не деться.
3. Проблемы портировать под Х не вижу. Написать соотв. стратегии. Или вы где-нибудь видели библиотеку, конечный код которой не вызывает системные функции? Счастливчик!
И еще раз повторюсь — библиотека в том виде, в котором изложена в статье, рассчитана на win32 изначально. И то, что она использует С++, четко отражено в названии статьи.
Ну и читать то, что пишет собеседник, тоже неплохо: AS>Платформенно-зависимые аспекты, ессно, тут включать в это не надо — функционал ориентирован на использование в среде win32.
Если функция GetModuleHandle, по вашему мнению, не соответствует нормам ansi C++, то и любые подобные функции в unix тоже соответствовать не будут. более того, в С++ вообще нет понятия о мультипоточности — впрочем, никто полного соответствия и не обещал.
R>
R>Как можно большая независимость от компилятора С++ (в пределах ANSI C++).
R>...
R>библиотека должна быть полностью функциональна на всех Visual C++ компиляторах
R>==
R>MSWord: Мултиплатформенное приложение, рапотает на Win98/W2K/XP
Где в статье хоть слово про мультиплатформенность? Там есть про желательность соответствия кода библиотеки нормам анси С++.
В общем, все с вами понятно. Если есть что по делу сказать — говорите. А так... смысла продолжать полемику в этом русле не вижу. Удачи.
AS>>надо ли обновлять исходники, выложенные тут — я не знаю.
OE>обновил
Дико извиняюсь, но, похоже, опять можно обновить исходники к статье. Я таки сделал там нормальный интерфейс для функций без параметров, соотв. дополнительные макросы стали не нужны. Адрес прежний — http://www.rsdn.ru/File/8583/delayimphlp.zip ...
Здравствуйте, Andrew S, Вы писали:
AS>Дико извиняюсь, но, похоже, опять можно обновить исходники к статье. Я таки сделал там нормальный интерфейс для функций без параметров, соотв. дополнительные макросы стали не нужны. Адрес прежний — http://www.rsdn.ru/File/8583/delayimphlp.zip ...
ок, обновил
... << RSDN@Home 1.1.4 beta 7 rev. 451>>
Re[4]: Реализация отложенной загрузки библиотек на С++
Здравствуйте, Andrew S:
В версии 1.1.1 при компиляции шаблона DL_DECLARE_FUN_THROW компилятором VС++ 7.1 выдаются два предупреждения С4702 и С4100. Как от них избавиться ?
Re[5]: Реализация отложенной загрузки библиотек на С++
23W>Здравствуйте, Andrew S: 23W>В версии 1.1.1 при компиляции шаблона DL_DECLARE_FUN_THROW компилятором VС++ 7.1 выдаются два предупреждения С4702 и С4100. Как от них избавиться ?
Вариантов несколько (у меня 4100 не выдается, только 4702)...
1. Установить уровень W как 3-й. Ничего полезного, на мой взгляд, 4-й не добавит.
2. Запретить эти предупреждения явно до включения библиотеки импорта.
Re[5]: Реализация отложенной загрузки библиотек на С++
От:
Аноним
Дата:
15.09.05 11:32
Оценка:
R>>
R>>Как можно большая независимость от компилятора С++ (в пределах ANSI C++).
R>>...
R>>библиотека должна быть полностью функциональна на всех Visual C++ компиляторах
Отличная штука! Только жаль не работает на ICC 8.1:
...
.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined
.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined
detected during instantiation of class "delayload::CFunProxy1Impl<void>" at line 571
...
и так 300 раз
Re[6]: Реализация отложенной загрузки библиотек на С++
А>... А>.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined А>.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined А> detected during instantiation of class "delayload::CFunProxy1Impl<void>" at line 571 А>...
А>и так 300 раз
Судя по ошибке, проблема с препроцессором, и наверняка это макрос DL_REPEAT_PARAM_N. Вот только непонятно, что там такого, чего не понимает ICC...
Жаль, этого компилятора у меня нет, так что лично поправить не получится.
R>>>Как можно большая независимость от компилятора С++ (в пределах ANSI C++).
R>>>...
R>>>библиотека должна быть полностью функциональна на всех Visual C++ компиляторах
А>Отличная штука! Только жаль не работает на ICC 8.1:
А>... А>.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined А>.\DelayLoad/delayimphlp.h(571): error: identifier "P1v1" is undefined А> detected during instantiation of class "delayload::CFunProxy1Impl<void>" at line 571 А>...
А>и так 300 раз
По адресу http://gzip.rsdn.ru/File/8583/delayimphlp.zip можно скачать обновление. Вместо предлаемых библиотекой макросов размножения параметров можно определением #define DL_USE_BOOST_PP перед включением заголовка библиотеки попросить ее использовать оные из буста.
2Odi$$ey — если можно, хорошо бы обновить исходники, которые идут к статье. Ссылка приведена выше. Спасибо.
Здравствуйте, Аноним, Вы писали:
А>К сожалению, эту методику нельзя использовать в dll. А>Вызов LoadLibrary/FreeLibrary в момент загрузки/выгрузки dll запрещен. А конструкторы и деструкторы в dll вызываются как раз в этот момент. А>/Sergey
Почему же вдруг нельзя ? Я использую широко эту библиотеку, в том числе и в dll. Дело в том, что непосредственно вызов LoadLibrary/FreeLibrary происходит не в момент загрузки твоего модуля (функиция dllmain), а в момент первого обращения к функции в "отложеннной" dll-ке, а это обычно происходит гораздо позже (при вызове экспортных функций вашего модуля).
Re[3]: Реализация отложенной загрузки библиотек на С++
От:
Аноним
Дата:
03.11.05 12:27
Оценка:
Здравствуйте, 23W, Вы писали:
23W>Почему же вдруг нельзя ? Я использую широко эту библиотеку, в том числе и в dll. Дело в том, что непосредственно вызов LoadLibrary/FreeLibrary происходит не в момент загрузки твоего модуля (функиция dllmain), а в момент первого обращения к функции в "отложеннной" dll-ке, а это обычно происходит гораздо позже (при вызове экспортных функций вашего модуля).
А выгрузка происходит после вызова DllMain(PROCESS_DETTACH) (неявно используется atexit(<destructor>))
Т.е. получается вложеный вызов FreeLibrary.
Это может привести к серьезным проблемам, подробнее — в MSDN, секция Remarks в описании DllMain
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.