Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
1

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

05.02.2016, 15:06. Просмотров 1741. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2016, 15:06
Ответы с готовыми решениями:

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

GetProcAddress не может найти функцию в dll
Хочу сделать глобальный хук клавиатуры. Сделал отдельный DLL со всем, что мне...

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

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

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

54
Hikari
Хитрая блондиночка $)
1451 / 963 / 399
Регистрация: 21.12.2015
Сообщений: 3,785
05.02.2016, 15:09 2
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
Не могу получить адрес
А эта KeyProc хоть экспортирована?
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 15:10  [ТС] 3
ну я явную dll делаю
0
Raali
646 / 349 / 75
Регистрация: 06.07.2013
Сообщений: 1,117
Завершенные тесты: 1
05.02.2016, 15:12 4
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
ну я явную dll делаю
что то не видно __declspec(dllexport)
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 15:13  [ТС] 5
я думал что она только в неявной загрузке

Добавлено через 30 секунд
напиши пож полностью эту строчку __declspec(dllexport)...
0
Raali
646 / 349 / 75
Регистрация: 06.07.2013
Сообщений: 1,117
Завершенные тесты: 1
05.02.2016, 15:15 6
дак допиши просто перед функцией своей)
__declspec(dllexport) LRESULT CALLBACK KeyProc ..
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 15:43  [ТС] 7
спс
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 15:46  [ТС] 8
у меня ошибка в основной проге вот лог:
В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?
0
Raali
646 / 349 / 75
Регистрация: 06.07.2013
Сообщений: 1,117
Завершенные тесты: 1
05.02.2016, 15:50 9
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
у меня ошибка в основной проге
компилятор не знает что такое FUNC
C++
1
typedef int (*FUNC)();
Добавлено через 1 минуту
только так тоже неправильно, потому, что KeyProc совершенно по-другому определена
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 15:51  [ТС] 10
новая ошибка:
В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?
0
Raali
646 / 349 / 75
Регистрация: 06.07.2013
Сообщений: 1,117
Завершенные тесты: 1
05.02.2016, 15:52 11
Цитата Сообщение от Amir_05_05 Посмотреть сообщение
новая ошибка
добавь к скрипту компиляции флаг -fpermissive
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
05.02.2016, 16:02  [ТС] 12
а что делает этот флаг?
Цитата Сообщение от Raali Посмотреть сообщение
-fpermissive
лог после добавления флага:
В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?
0
Raali
646 / 349 / 75
Регистрация: 06.07.2013
Сообщений: 1,117
Завершенные тесты: 1
05.02.2016, 16:05 13
это не очень хороший флаг) который разрешает компилятору трактовать некоторые ошибки (такие как несовпадение типов например) как предупреждения
вообще функция 4 параметром принимает DWORD threadID( id потока) который тут можно было ставить нулем

C++
1
SetWindowsHookEx(WH_KEYBOARD,func,hinstDLL,0);
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
06.02.2016, 17:37  [ТС] 14
понятно

Добавлено через 14 минут
а 4-й параметр разве не принимает адрес функции dll?

Добавлено через 5 часов 15 минут
вопрос актуален!

Добавлено через 3 минуты
В общем напишите пож. каркас программы заливающий dll в память(LoadLibrary) и считывающий адрес функции(GetProcAddress).Буду благодарен

Добавлено через 19 часов 55 минут
проблема осталась!помогите
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
06.02.2016, 17:46 15
Amir_05_05, сделайте для начала нормальную обработку ошибок. Какая функция фэйлит? С каким кодом ошибки?
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
06.02.2016, 17:55  [ТС] 16
это тестовая программа

Добавлено через 7 минут
вот немного отредактировал прогу и скомпилировалось ,но выдает адрес-0
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<windows.h>
#include<iostream>
#include"hook.h"
using namespace std;
int main(){
typedef FARPROC(*FUNC)(char *);
FUNC func;
MSG msg;
HINSTANCE hinstDLL;
hinstDLL=LoadLibrary("dll.dll");
 func=(FUNC)GetProcAddress(hinstDLL,"pnx");
_hook = SetWindowsHookEx(WH_KEYBOARD,0,hinstDLL,(DWORD)func);
cout<<(FARPROC)func;
while(1){
PeekMessage(&msg,NULL,0,0,0);
}
    }
0
jupman
230 / 133 / 19
Регистрация: 10.11.2015
Сообщений: 305
06.02.2016, 18:42 17
Amir_05_05, а может у вас LoadLibrary фэйлит. Проверьте что она вернула, если NULL то получите и выведите код ошибки (GetLastError). После GetProcAddress делайте аналогично. Если API может потерпеть неудачу вы должны всегда делать такую проверку.

Добавлено через 14 минут
Что-то типа такого должно быть:

C++
1
2
3
4
5
6
7
8
9
10
11
    HMODULE hModule = LoadLibrary(L"dll.dll");
    if (!hModule) {
        cout << "LoadLibrary failed, last error: " << GetLastError() << endl;
        return 0;
    }
 
    FARPROC pFunc = GetProcAddress(hModule,"pnx");
    if (!pFunc) {
        cout << "GetProcAddress failed, last error: " << GetLastError() << endl;
        return 0;
    }
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
07.02.2016, 12:45  [ТС] 18
LoadLibrary работает норм и выводит адрес dll
Добавлено через 4 минуты
GetProcAddress(GetLastError)-ошибка 127-Не найдена указанная процедура.

Добавлено через 5 минут
почему не найдена?
исх. код:
C++
1
HOOKPROC func=(HOOKPROC)GetProcAddress(hinstDLL,"KeyProc");
dll:
C++
1
__declspec(dllexport) LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam)
Добавлено через 1 час 3 минуты
люди,помогите!
0
castaway
Эксперт С++
4934 / 3039 / 455
Регистрация: 10.11.2010
Сообщений: 11,119
Записей в блоге: 10
Завершенные тесты: 1
07.02.2016, 13:24 19
Amir_05_05, саму DLL в запакованном виде выложите сюда.
0
Amir_05_05
0 / 0 / 0
Регистрация: 06.06.2015
Сообщений: 240
07.02.2016, 13:29  [ТС] 20
C++
1
2
3
4
5
6
7
#include<windows.h>
#include<iostream>
HHOOK _hook;
__declspec(dllexport) LRESULT CALLBACK KeyProc(int ncode,WPARAM wParam,LPARAM lParam){
    std::cout<<"123";
    return CallNextHookEx(_hook,ncode,wParam,lParam);
}
0
07.02.2016, 13:29
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.02.2016, 13:29

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

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

В чем причина ошибки?
Код int main() { char arr; scanf(&quot;%s %s&quot;, &amp;arr, &amp;arr); ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru