Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

GetProcAddress не может найти функцию в dll

18.07.2017, 01:51. Показов 2627. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу сделать глобальный хук клавиатуры. Сделал отдельный DLL со всем, что мне надо. Подрубаю DLL в программу через LoadLibrary(), все работает. Когда пытаюсь получить адрес функции, которая обрабатывает сообщения от хука с помощью GetProcAddress(), возвращается NULL. Пробовал разные имена функции: оригинальное, с дополнительной фигней от __declspec(dllexport). Посоветовали делать через DEF файлы делать, но я не до конца разобрался с ними, поэтому не уверен, если у меня верно было все, когда через них делал (делал с MFC DLL в студии).

Программа:

Main.cpp:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include "stdafx.h"
#include "Win32.h"
 
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    HHOOK hHookKeyboard;
    HINSTANCE keyboardProcDLL;
    HOOKPROC hookProcKeyboard;
 
    keyboardProcDLL = LoadLibrary(L"C:/Users/Michael/Documents/visual studio 2015/Projects/Win32Project3/Release/PV_KeyboardDLL.dll");
    if (keyboardProcDLL == NULL)
    {
        MessageBox(NULL, L"Could not load library!", L"Error", MB_ICONERROR);
        return -1;
    }
 
    hookProcKeyboard = (HOOKPROC)GetProcAddress(keyboardProcDLL, "PV_KeyboardProc");
    if (hHookKeyboard == NULL)
    {
        // БУМ!!!! 
        MessageBox(NULL, L"Could not load function from library!", L"Error", MB_ICONERROR);
        return -1;
    }
 
    hHookKeyboard = SetWindowsHookEx(WH_KEYBOARD_LL, hookProcKeyboard, keyboardProcDLL, 0);
 
    while (1)
    {
 
    }
 
    return 0;
}


PV_KeyboardDLL.cpp:
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include "stdafx.h"
 
bool toggleOnOff = false; // off by default
 
 
template<typename Type>
inline bool highOrderBit(Type value)
{
    return (value & (1 << sizeof(Type) * 8 - 1));
}
 
template<typename Type>
inline bool lowOrderBit(Type value)
{
    return (value & 1);
}
 
extern "C"
{
    __declspec(dllexport) LRESULT CALLBACK PV_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        // process event
        if (nCode < 0)  // do not process message 
        {
            return CallNextHookEx(NULL, nCode, wParam, lParam);
        }
 
        if (wParam != WM_KEYDOWN)
        {
            return CallNextHookEx(NULL, nCode, wParam, lParam);
        }
 
        KBDLLHOOKSTRUCT* KeyBoardHookStruct = reinterpret_cast<KBDLLHOOKSTRUCT*>(lParam);
 
        DWORD keyCode = KeyBoardHookStruct->vkCode;
 
        bool ctrlDown, altDown;
 
        // high-order is 1 - DOWN
        ctrlDown = highOrderBit(GetKeyState(VK_LCONTROL));
        altDown = highOrderBit(GetKeyState(VK_MENU));
 
        // ctrl + alt + 1(key down)
        if (ctrlDown && altDown && (keyCode == 0x31))
        {
            // toggle bool
            MessageBox(NULL, L"Workin", L"Ok", MB_OK);
 
            toggleOnOff = !toggleOnOff;
        }
 
        return CallNextHookEx(NULL, nCode, wParam, lParam);
    }
 
    __declspec(dllexport) bool onOrOff()
    {
        return toggleOnOff;
    }
}


В случае с MFC DLL, когда пытался че-то сварить с DEF файлами, все тоже самое, но в .def писал:
C++
1
2
3
4
LIBRARY PV_KEYBOARD
EXPORTS
    PV_KeyboardProc @1
    toggleOnOff @2
И убрал __declspec(dllexport)

Пишет из-за этого .def:
Кликните здесь для просмотра всего текста

Серьезность Код Описание Проект Файл Строка Состояние подавления
Предупреждение LNK4070 директива /OUT:PV_KEYBOARD.dll в .EXP отличается от имени выходного файла "c:\users\michael\documents\visual studio 2015\Projects\MFCLibrary3\Release\MFCLib rary3.dll"; директива игнорируется MFCLibrary3 c:\Users\Michael\documents\visual studio 2015\Projects\MFCLibrary3\MFCLibrary3\MF CLibrary3.exp 1
Серьезность Код Описание Проект Файл Строка Состояние подавления

Предупреждение LNK4070 директива /OUT:PV_KEYBOARD.dll в .EXP отличается от имени выходного файла "c:\users\michael\documents\visual studio 2015\Projects\MFCLibrary3\Release\MFCLib rary3.dll"; директива игнорируется MFCLibrary3 c:\Users\Michael\documents\visual studio 2015\Projects\MFCLibrary3\MFCLibrary3\MF CLibrary3.exp 1


Добавлено через 1 минуту
Пробовал имена функции: _PV_KeyboardProc и _PV_KeyboardProc@12, все равно по нулям.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.07.2017, 01:51
Ответы с готовыми решениями:

LoadLibrary, GetProcAddress: как правильно подгружать функцию из библиотеки?
Подскажите пожалуйста, как правильно подгружать функцию из библиотеки? пытаюсь так, не получается... auto lib =...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

В чем причина ошибки при получении адреса функции из dll с помощью функции GetProcAddress?
Здравствуйте.Не могу получить адрес функции из dll с помощью функции GetProcAddress. dll: #include&lt;windows.h&gt; HHOOK _hook; ...

2
298 / 107 / 31
Регистрация: 12.03.2012
Сообщений: 449
18.07.2017, 03:16
если нет никаких PE-вьюверов, можно залить dll на virustotal и во второй секции посмотреть экспортированные имена

Цитата Сообщение от meJevin Посмотреть сообщение
Пишет из-за этого .def:
можно внимания не обращать, это потому что LIBRARY переопределен
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
18.07.2017, 03:40  [ТС]
Упс!! Опечатка! Я проверяю hHookKeyboard, а не мой хендл функции!!! ультра невнимательно. все решено!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.07.2017, 03:40
Помогаю со студенческими работами здесь

GetProcAddress не может получить адрес ф-ии из dll
Осваиваю написание dll, GetProcAddress не может получить адрес ф-ии из моей dllки? Где может быть засада? В экспоре ф-я вроде должна быть…...

Загрузка переменной из DLL (GetProcAddress не берет значение переменной из *.dll)
GetProcAddress не берет значение переменной из *.dll Не могу понять почему. Помогите. ------------------------- *********** ...

Программа не может найти dll
Не могу понять в чем беда. Запускаю экзешник, а он выдает что не может найти dll. (лежат в одной папке) #include...

OllyDbg не может найти файл _etoured.dll
При загрузке в OllyDbg абсолютно любой программы, выкидывает ошибку, якобы не может прочитать dll- файл. Для чего чего нужен этот файл...

Borland C++ Builder 6.0 не может найти свои же dll файлы
Недавно установил Borland C++ Builder 6.0 . Всё бы хорошо но при компиляции проэкта пишет что не знает где файлы: borlndmm.dll ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru