Класс-обертка динамически связываемого указателя на функцию
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 06.02.02 22:27
Оценка: 280 (4)
Статья:
Класс-обертка динамически связываемого указателя на функцию
Автор(ы): Игорь Вартанов
Дата: 07.02.2002


Авторы:
Игорь Вартанов

Аннотация:
Да-да, я в очередной раз устал... Устал от динамической загрузки "ручками", от всех этих LoadLibrary(), FreeLibrary(), typedef и GetProcAddress()... Контроля за хэндлами и указателями и прочей мути, однообразной и надоедливой (типа необходимости тупо вспоминать, имя функции — это макрос на ..A и ..W, или оно по жизни такое, как я его помню)... Ну и вот...
---
С уважением,
Игорь
Горбуха
От: Блудов Павел Россия  
Дата: 23.06.02 22:12
Оценка:
Класс не компиляется, что не удивительно. Второй параметр функции ::GetProcAddress имеет тип LPCSTR,
а Вы, уважаемый, суете ему LPCTSTR. Надо бы поправить
Еще один такой класс
От: TepMuHyc  
Дата: 11.02.02 02:37
Оценка:
Вот тут — http://www.rsdn.ru/forum/message.asp?mid=20397&only
Автор: TepMuHyc
Дата: 08.01.02
— лежит такой же класс, но, имхо, реализованный несколько лучше т.к. он передоставляет выбор как получать хендл библиотеки — через LoadLibrary() или через GetModuleHandle().
Второй вариант предпочтительнее если библиотека уже используется приложением, но неизвестно экспортируется ли функция даной версией библиотеки (что бывает довольно-таки часто, если пишем прогу которая должна работать и под WinNT и под Win9x)
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Насчет улучшений.
От: m.a.g. Мальта http://dottedmag.net/
Дата: 07.02.02 22:27
Оценка:
Hi.

Насчет странного синтаксиса. Поскольку наш объект только прикидывается функцией, а не является ей, то, похоже, полностью синтаксис функции получить не получится. Зато можно попробовать получить синтаксис указателя на функцию, переопределив operator*. Тогда все выглядит как обычный указатель на функцию: (*funcName)(arg1, arg2, ...)

wbr, Mikhail Gusarov.
Re: Горбуха
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 29.08.02 09:49
Оценка:
Fixed at last. :)
---
С уважением,
Игорь
И тут горбуха
От: Блудов Павел Россия  
Дата: 23.06.02 22:16
Оценка:
Забавно, но на том же месте. Не знаю, чем в майкрософт думали, когда писали ::GetProcAddress().
Вобщем, нужно поменять MAKEINTRESOURCE(nFuncID) на MAKEINTRESOURCEA(nFuncID) и класс скомпиляется.

Господа! Ну не смешно. Компилируйте, пожалуйстя, свои классы, прежде чем показывать общественности.
Re: Еще один такой класс
От: Игорь Вартанов https://mvp.support.microsoft.com/profile=3317CC31-AB7A-4D36-864E-47DEFF433151
Дата: 13.02.02 08:03
Оценка:
Если подумать, то не лучше. В таком случае сохраняется возможность, что будет существовать указатель на функцию в dll, которая уже выгружена. Если инстансы получать только через LoadLibraray, то работает системный счетчик использования, не давая длли выгрузиться.
---
С уважением,
Игорь
Re: Еще один такой класс
От: TepMuHyc  
Дата: 11.03.02 01:47
Оценка:
...А если еще раз подумать — то бабушка надвое сказала.
Вот тебе пример: Имеем фунцию RegisterServiceProcess() котрая в мастдаях живет в KERNEL32.DLL. А эта либа подгружена _всегда_. Это же касается и других "популярных" либ — USER32, GDI32, ADVAPI — в особенности если используются фичи зависимые от версии виндов. Я еще не видел случая когда эти либы загружались бы динамически. И здесь загрузке через GetModuleHandle() — самое место.
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Re: Класс-обертка динамически связываемого указателя на функ
От: jksgfv  
Дата: 22.01.08 08:41
Оценка:
По поводу "странного синтаксиса".
можно вместо

T operator()();


попробовать просто

operator T();


тогда наш объект будет неявно конвертироваться в указатель на функцию, и при добавлении скобок с параметрами всё будет выглядеть довольно естественно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.