Класс-обертка динамически связываемого указателя на функцию
Опубликовано: 07.02.2002
Исправлено: 13.03.2005
Версия текста: 1.0
Хэдер класса-шаблона
Демонстрационный проект
Да-да, я в очередной раз устал... Устал от динамической загрузки "ручками",
от всех этих LoadLibrary(), FreeLibrary(), typedef и
GetProcAddress()... Контроля за хэндлами и указателями и прочей мути,
однообразной и надоедливой (типа необходимости тупо вспоминать, имя функции -
это макрос на ..A и ..W, или оно по жизни такое, как я его помню)... Ну и вот...
class CDynaLinkResolver
Собственно интерфейс класса-шаблона незамысловат:
template <class T>
class CDynaLinkResolver
{
protected:
T m_pRef;
HINSTANCE m_hLib;
public:
CDynaLinkResolver();
CDynaLinkResolver( LPCTSTR pszLib, LPCSTR pszName );
virtual ~CDynaLinkResolver();
BOOL IsValid();
BOOL Link( LPCTSTR pszLib, LPCSTR pszName );
BOOL Unlink();
HINSTANCE GetInstance();
T Refer();
T operator()();
}; |
- Пара конструкторов и виртуальный деструктор достаточно стандартны.
- Метод IsValid() позволяет динамически проверить значение указателя на
функцию на условие "not NULL".
- Метод Link() позволяет выполнить связывание в нужный момент, если
объект создавался при помощи конструктора по-умолчанию (т.е. несвязанный).
- Метод Unlink() позволяет не дожидаться выхода локально созданного
объекта за пределы видимости функции, и освободить dll немедленно.
- Метод GetInstance() возвращает инстанс модуля для указателя на
функцию.
- Метод Refer() дает возможность получить указатель на функцию из
объекта (для чего, собственно, все и затевалось :-)).
- Оператор operator() практически дублирует действие метода
Refer(). Особой пользы от него нет, но мне он почему-то приглянулся
(может вы мне скажете почему? :-)).
ПРИМЕЧАНИЕ Кстати, пока не представляю, как улучшить класс, чтобы исчез этот
странный синтаксис вызова функции FuncName()(arg1, arg2,...) и
FuncName.Refer()(arg1, arg2,...) .
Tell me if You know how to cure. |
... и несколько макросов к нему
В принципе, можно сказать, что они не нужны. Но мне все же показалось удобным
пользоваться ими (думаю, время еще покажет). Хотя... Если помните, я в начале
говорил о "проблеме" имен-макросов на ..A и ..W. Так вот применение этой
четверки макросов позволяет эту проблему обойти (препроцессор поможет :-)).
Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы
то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских
прав.