0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240

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

05.02.2016, 15:06. Показов 4654. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru