1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи.
2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию.
Здравствуйте, quodum, Вы писали:
Q>Здравствуйте, fromrus, Вы писали:
Q>1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи.
Q>2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию.
1.Как обойтись без экспорта деф-файла?Никак?
2.Что значит "HHOOK hook положить в разделяемую секцию"-что значит разделяемая секция?
"fromrus" <77202@users.rsdn.ru> сообщил/сообщила в новостях следующее: news:3108051@news.rsdn.ru... > Здравствуйте, quodum, Вы писали: > > Q>Здравствуйте, fromrus, Вы писали: > > Q>1. Ключевые слова для поиска -- декорирование имён, экспорт, def-файл. Ещё есть замечательные утилиты depends и dumpbin из комплекта MSVC, которые показывают, что на самом деле экспортируется из DLLи. > > Q>2. Ещё нужно переменную HHOOK hook положить в разделяемую секцию. > > 1.Как обойтись без экспорта деф-файла?Никак?
а кстати hookProc и не обязана экспортироваться, т.к. в SetWindowsHookEx передается адрес hookProc. Ей совершенно не обязательно быть экспортируемой.
Def-файл для экспорта не нах не нужен, проще и быстрее как и сделано через
extern "C" __declspec(dllexport)
Другой момент что судя по тому что ХУКПРОК ((С) пытается быть экспортируемой да хук глобальной она находится в DLL. Соответственно в момент вызова SetWindowsHookEx ее адрес неизвестен. Его и нужно получить из DLL
1) Используя вариант с экспортом функции + GetProcAddress
2) Засунув в DLL еще одну функцию, которая будет возвращать адрес hookProc
//DLL кодint CALLBACK HookProc(...) {
//сама хуковая процедура
}
extern"C"void* __declspec(dllexport) GetHookProcAddress(void)
{
retuen HookProc
}
//Exe код
1.получаем адрес GetHookProcAddress
2. Вызываем по адресу из п.1 функцию GetHookProcAddress, она вовращает реальный адрес HookProc в DLL
3. Стави хук и передаем ему адрес HookProc полученный при вызове GetHookProcAddress в п.2
Здравствуйте, fromrus, Вы писали:
F>1.Как обойтись без экспорта деф-файла?Никак?
Можно и без def-файла. Сейчас у тебя проблема в том, что функция экспортируется под декорированным именем. Соответственно, путей решения два:
а) добавить def-файл и указать в нём желаемое имя экспорта
б) посмотреть чем-нибудь (например, dumpbin или depends) декорированное имя и импортировать функцию по этому имени.
Этот вопрос всплывает тут с завидной регулярностью, вот хотя бы на прошлой неделе был. <old-grumbler-rant>До чего люди ленивые пошли, им даже ключевые слова для поиска дают, а всё равно, пока не разжуёшь и в рот не положишь, не пошевелятся!.. </old-grumbler-rant>
выше Carc. А именно, добавляют в интерфейс DLLи функции для установки и снятия хука, а саму процедуру хука не экспортируют. Это удобно в том смысле, что сама DLL знает, какая инициализация нужна для установки хука и какой клинап после снятия.
F>2.Что значит "HHOOK hook положить в разделяемую секцию"-что значит разделяемая секция?
выше Carc. А именно, добавляют в интерфейс DLLи функции для установки и снятия хука, а саму процедуру хука не экспортируют. Это удобно в том смысле, что сама DLL знает, какая инициализация нужна для установки хука и какой клинап после снятия.
Именно так! Нехай ДЛЛ сама все рулит. Кто девушку платит, тот девушку и танцует. Внутри DLL явно больше информации: как ставить и как снимать хук: флаги там какие-либо, проверки на повторную установку хука и в таком же духе.
Опять таки ну не обязательно что hookProc была экспортируемая, т.к. SetWindowsHookEx нужен только ее адрес, который можно получить как писал выше. Опять же когда хуковоя процедура экспортируемая, какая-нибудь добрая душа рано или поздно ее импортнет и вызовет... И тут начнется "позови меня с собой"