Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240

В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?

05.02.2016, 15:06. Показов 4445. Ответов 54
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.Не могу получить адрес функции из dll с помощью функции GetProcAddress.
dll:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include<windows.h>
HHOOK _hook;
int code;
bool key;
UINT scancode;
WPARAM wPararam;
LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam){
    KBDLLHOOKSTRUCT * pStruct = (KBDLLHOOKSTRUCT *)lParam;
    code=pStruct->vkCode;scancode=pStruct->scanCode;
    wPararam=wParam;
    if(wParam==WM_KEYUP){key=false;code=0;}else{key=true;}
    return CallNextHookEx(_hook,ncode,wParam,lParam);
}
осн.прога:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<windows.h>
#include<iostream>
#include"hook.h"
using namespace std;
int main(){
int (*func)();
FUNC func;
MSG msg;
HINSTANCE hinstDLL;
hinstDLL=LoadLibrary("dll.dll");
 (FARPROC &)func=GetProcAddress(hinstDLL,"KeyProc");
_hook = SetWindowsHookEx(WH_KEYBOARD,0,hinstDLL,func);
while(1){
PeekMessage(&msg,NULL,0,0,0);   
}
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.02.2016, 15:06
Ответы с готовыми решениями:

Неправильная работа функции @attachmentnames... в чем причина?
В документе в трех richtext полях хранится 10 файлов. Для 6 функция возвращает правильные названия, а для 4 - левые... В RT полях файлы...

Изучаю функции. Значение (max и min) не меняется, в чем причина?
#include &quot;pch.h&quot; #include &lt;iostream&gt; #include &lt;math.h&gt; #include&lt;stdio.h&gt; using namespace std; void CoutArray(int M, int strok,...

Получение адреса функции из .dll
Есть некоторая библиотека RSA_DLL.dll. Она в какой-то программе динамически подгружается. Так вот, как можно получить адрес функции...

54
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.02.2016, 18:19
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Убежденный Посмотреть сообщение
Здесь же смешивание cdecl и stdcall (CALLBACK = stdcall).
Точно.

Цитата Сообщение от Amir_05_05 Посмотреть сообщение
теперь надо постоянно открывать dll и смотреть имя функции?
Зачем тебе её постоянно открывать и смотреть? Просто используй всегда это имя.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
07.02.2016, 20:41  [ТС]
А как объявить этот def файл и что в нем записать?

Добавлено через 2 минуты
castaway, я заметил что это имя меняется при изменение возвращаемого типа функции
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
07.02.2016, 20:49
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
castaway, я заметил что это имя меняется при изменение возвращаемого типа функции
А вы в курсе что вам нельзя менять прототип (в т.ч. и возвращаемое значение) именно этой функции?
Функция SetWindowsHookEx принимает её такой какой она должна быть, а не такой как вы её опишите.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
07.02.2016, 20:51  [ТС]
В курсе,я просто эксперементировал
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
09.02.2016, 15:04  [ТС]
проблема осталась,как объявить def файл и выполнить функцию в dll?

Добавлено через 1 час 13 минут
функцию получилось выполнить!Но возникает ещё один вопрос: как передать\возвратить параметры в\из этой функции?
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
09.02.2016, 15:27  [ТС]
я знаю как возвращать\передавать параметры в обычные функции,но в dll я не знаю как это реализовать и поэтому пришёл сюда!
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.02.2016, 15:30
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
я знаю как возвращать\передавать параметры в обычные функции,но в dll я не знаю как это реализовать
Ты удивишься, но так же.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
09.02.2016, 15:31  [ТС]
ок, а как передать в хуковую функцию?

Добавлено через 18 секунд
LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam)
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.02.2016, 15:48
"хуковую функцию", как ты её называешь, не надо вызывать вручную.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
09.02.2016, 15:54  [ТС]
Цитата Сообщение от castaway Посмотреть сообщение
"хуковую функцию", как ты её называешь, не надо вызывать вручную.
всмысле вручную? я вызываю ее так:
C++
1
_hook=SetWindowsHookEx(WH_KEYBOARD,func,hinstDLL,0);
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
09.02.2016, 17:44
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
Но возникает ещё один вопрос: как передать\возвратить параметры в\из этой функции?
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
я вызываю ее так
Ты её не вызываешь.
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
04.03.2016, 14:16  [ТС]
написал след. код
исх. код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<windows.h>
#include<iostream>
#include"hook.h"
using namespace std;
int main(){
HOOKPROC func;
typedef FARPROC(*FUNC)();
FUNC func2;
MSG msg;
HINSTANCE hinstDLL;
hinstDLL=LoadLibrary("dll.dll");
func=(HOOKPROC)GetProcAddress(hinstDLL,"_Z7KeyProcijl@12");
func2=(FUNC)GetProcAddress(hinstDLL,"_Z7num_keyv");
SetWindowsHookEx(WH_KEYBOARD,func,hinstDLL,0);
while(1){
    if((int)func2()!=0)
    cout<<(int)func2();
PeekMessage(&msg,NULL,0,0,0);
}
}
dll:
C++
1
2
3
4
5
6
7
8
9
10
11
#include<windows.h>
HHOOK _hook;
int code=0;
LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam){
    code=(int)wParam;
    MessageBox(NULL,"123","hook!",MB_ICONWARNING);
    return CallNextHookEx(_hook,ncode,wParam,lParam);
}
int num_key(){
    return code;
}
хук срабатывает и messagebox вызывается.Но мне нужно получить код нажатой клавиши.Попробовал создать глобальную переменную в dll и с другой функции возвращать ее в основную прогу,но не получилось.Заранее спасибо
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
07.03.2016, 22:59  [ТС]
Проблема осталась и я жду ваших ответов
0
 Аватар для Alex xelA
100 / 38 / 20
Регистрация: 27.02.2016
Сообщений: 135
07.03.2016, 23:46
По-моему, в вашей второй теме уже показаны пример взаимодействия dll с основной программой. Или у вас другая проблема уже?
0
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
08.03.2016, 10:09  [ТС]
В той теме было другое,тут конкретно нужно возвратить код нажатой клавиши,я имею представление как это сделать,но может вы посоветуете другой вариант,менее ресурсопотребляемый и надежный
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
08.03.2016, 10:09
Помогаю со студенческими работами здесь

Задача: подмена адреса функции из DLL.
Здравствуйте уважаемые программисты. Пожалуйста, помогите решить задачу. Нужно в моей программе подменить адрес функции причём из длл, во...

C2912: специализация функции не является специализацией какого-то конкретного шаблона (в чём причина ошибки?)
Есть шаблонная функция, а есть её конкретная специализация для типа имени структуры box. Почему-то отказывается работать, ссылаясь на...

Ошибка при получении результата функции
Всем привет. Есть функция ORACLE, которая возвращает данные из таблицы: FUNCTION retrieve_all RETURN table_type IS ...

Ошибка при получении результата из функции
Здравствуйте, помогите разобраться с функцией. При одном запросе на кнопку она выполняется, я получаю результат, а при работу через таймер...

Перехват функции - GetProcAddress
Здравствуйте. Покажите пожалуйста пример, как перехватит в dll &quot;A&quot; , функцию из dll &quot;Б&quot; В интернете только базовые примеры...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
55
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru