Аннотация:
Да-да, я в очередной раз устал... Устал от динамической загрузки "ручками", от всех этих LoadLibrary(), FreeLibrary(), typedef и GetProcAddress()... Контроля за хэндлами и указателями и прочей мути, однообразной и надоедливой (типа необходимости тупо вспоминать, имя функции — это макрос на ..A и ..W, или оно по жизни такое, как я его помню)... Ну и вот...
Класс не компиляется, что не удивительно. Второй параметр функции ::GetProcAddress имеет тип LPCSTR,
а Вы, уважаемый, суете ему LPCTSTR. Надо бы поправить
— лежит такой же класс, но, имхо, реализованный несколько лучше т.к. он передоставляет выбор как получать хендл библиотеки — через LoadLibrary() или через GetModuleHandle().
Второй вариант предпочтительнее если библиотека уже используется приложением, но неизвестно экспортируется ли функция даной версией библиотеки (что бывает довольно-таки часто, если пишем прогу которая должна работать и под WinNT и под Win9x)
____________________
God obviously didn't debug, hasn't done any maintenance, and no documentation can be found. Truly amateur work.
Насчет странного синтаксиса. Поскольку наш объект только прикидывается функцией, а не является ей, то, похоже, полностью синтаксис функции получить не получится. Зато можно попробовать получить синтаксис указателя на функцию, переопределив operator*. Тогда все выглядит как обычный указатель на функцию: (*funcName)(arg1, arg2, ...)
Забавно, но на том же месте. Не знаю, чем в майкрософт думали, когда писали ::GetProcAddress().
Вобщем, нужно поменять MAKEINTRESOURCE(nFuncID) на MAKEINTRESOURCEA(nFuncID) и класс скомпиляется.
Господа! Ну не смешно. Компилируйте, пожалуйстя, свои классы, прежде чем показывать общественности.
Если подумать, то не лучше. В таком случае сохраняется возможность, что будет существовать указатель на функцию в dll, которая уже выгружена. Если инстансы получать только через LoadLibraray, то работает системный счетчик использования, не давая длли выгрузиться.
...А если еще раз подумать — то бабушка надвое сказала.
Вот тебе пример: Имеем фунцию 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: Класс-обертка динамически связываемого указателя на функ