Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
1

Доступ к функции библиотеки на основе *.dll и *.h

29.09.2016, 15:34. Показов 2988. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется стандартная библиотека setupapi.dll. Есть заголовочный файл к ней setupapi.h, в котором объявлены прототипы функций. Но объявлены кучеряво:
Листинг 1.
C++
1
2
#define SetupDiGetClassDevs SetupDiGetClassDevsA// есть такой дефайн
WINSETUPAPI HDEVINFO WINAPI SetupDiGetClassDevsA(CONST GUID*,PCSTR,HWND,DWORD);
Т.е. нужно сначала в программе каким-то образом объявить указатель на эту функцию - someptr, чтобы потом присвоить ему адрес функции вызовом LoadLibrary.
Я сделал так:
Листинг 2.
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
#include <stdio.h>
#include <windows.h>
#include <setupapi.h>
#include <devguid.h>
#include <regstr.h>
#include <iostream>
#ifndef _WINNT_H
#define _WINNT_H
#include <winnt.h>
#endif
using namespace std;
 
    //1. Определяем новый тип
   typedef HDEVINFO (__stdcall *PSetupDiGetClassDevs)(CONST GUID*,PCSTR,HWND,DWORD);
   //typedef void (*MyFunc)(CONST GUID*,PCSTR,HWND,DWORD);
   typedef void (*MyFunc)(void);
   //2. обнуляем указатель
   PSetupDiGetClassDevs SetupDiGetClassDevss = NULL;
    HINSTANCE hSetupApiDll;
 
   int main( int argc, char *argv[ ], char *envp[ ] )
   {
       //3. загружаем библиотеку
       hSetupApiDll = LoadLibrary("setupapi.dll");
       if(hSetupApiDll!=0){
           cout << "Lib loaded!" << endl;
           //4. Обновляем указатель
           SetupDiGetClassDevss = (PSetupDiGetClassDevs)GetProcAddress(hSetupApiDll, "SetupDiGetClassDevsA");
            //5. Если функция найдена, то указатель не нулевой
            if(SetupDiGetClassDevss!=0){
                cout << "Function is founded" << endl;
            }
            else{
                int error = GetLastError();
                cout << error<< endl;
            }
 
       }
       //6. освобождаем либу
       FreeLibrary(hSetupApiDll);
   }
Функция нашлась, все хорошо. Но ведь в заголовочнике уже описан прототип. Подозреваю, что есть более простой способ объявить указатель. Как?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2016, 15:34
Ответы с готовыми решениями:

Функции библиотеки bass.dll
Народ подскажите какие функции есть у этой библиотеки и их парметры. Или подскажите где можно...

Приложение не видит функции из публичного класса DLL библиотеки
Создал библиотеку классов (.Net Framework). Добавляю ссылку на DLL - он её видит, видит внутри неё...

Создание dll библиотеки в C#. Вызов классов этой библиотеки
мне нужно как то создать динамическую библиотеку класов в си шарп, основой этой библиотеки должен...

Как использовать методы библиотеки DLL, и игнорировать их, когда DLL нету?
Как использовать методы библиотеки DLL , и игнорировать их когда DLL нету Что нужно , мне нужно...

8
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.09.2016, 15:51 2
А не проще ли подключить setupapi.lib и вызвать функцию напрямую
(раннее связывание dll)?
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
29.09.2016, 17:27  [ТС] 3
У меня нет setupapi.lib, f pkst zpsrb говорят, что набор функций отдельно взятой версии setupapi.lib может не совпадать с setupapi.dll, аналогично и с другими dll.
Посему и корячусь так.
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
29.09.2016, 17:39 4
Цитата Сообщение от leshafree Посмотреть сообщение
что набор функций отдельно взятой версии setupapi.lib может не совпадать с setupapi.dll, аналогично и с другими dll.
Не, это ерунда какая-то.
Microsoft собирает dll и выкладывает .h и .lib-файлы, которые соответствуют
их публичному интерфейсу, т.е. тому, который описан в MSDN и который
поддерживается на соответствующих версиях Windows.

Какие конкретно могут быть проблемы с, например, SetupDiGetClassDevs,
если ее сигнатура не менялась уже много лет?

То, что набор функций в .lib, .h и .dll различается, не играет в данном
случае никакой роли, т.к. при загрузке dll связывание выполняется не по
сигнатурам или каким-то другим бинарным характеристикам, а по именам.

Цитата Сообщение от leshafree Посмотреть сообщение
У меня нет setupapi.lib
Если у тебя установлена Visual Studio с C++ на борту или Windows SDK или
Windows Driver Kit, то этот файл должен быть, это 100%.
1
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
29.09.2016, 18:30  [ТС] 5
Уу, была где то 6 студия, попробую из нее выудить, а так то codeblocks пользуюсь.
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 352
29.09.2016, 19:28 6
Цитата Сообщение от leshafree Посмотреть сообщение
У меня нет setupapi.lib
Цитата Сообщение от leshafree Посмотреть сообщение
а так то codeblocks пользуюсь
Должна быть в codeblocks (точнее конечно в mingw), только она называется libsetupapi.a
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
30.09.2016, 14:44  [ТС] 7
Да?? Спасибо за наводку, погляжу завтра.

Добавлено через 19 часов 0 минут
GoshaM ага, есть такой файл. Вот как его теперь прикрутить? Нигде толком не сказано. Везде через ключи компилятора. А иного способа нет?
0
413 / 148 / 48
Регистрация: 02.06.2016
Сообщений: 352
30.09.2016, 15:05 8
В меню Project->Buid options...
В открывшемся диалоге должно быть выделено название проекта, а не сборки (левый верхний угол).
Закладка Linker settings
Кнопка Add
Вводится название setupapi
1
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
30.09.2016, 15:22  [ТС] 9
Разобрался немного. Компилятор теперь не ругается сильно. Попробую выудить поработать с либами.

Добавлено через 3 минуты
Цитата Сообщение от GoshaM Посмотреть сообщение
В меню Project->Buid options...
В открывшемся диалоге должно быть выделено название проекта, а не сборки (левый верхний угол).
Закладка Linker settings
Кнопка Add
Вводится название setupapi
ОО, вот это я понимаю инструкция) Спасибо! Едем дальше.
0
30.09.2016, 15:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.09.2016, 15:22
Помогаю со студенческими работами здесь

Где взять библиотеки JSCore.dll и WebKitCore.dll
Доброго времени суток. Скачал ExpressoBrowser-master, пытаюсь запустить через SharpDevelop 4.4,...

Слетели библиотеки .dll При запуске любых приложений на компьютере вылетает ошибка с расширением .dll
Не запускается приложения на windows 8. А также удалились точки доступа Восстановления Системы и...

Библиотеки libeay32.dll ssleay32.dll
procedure TForm1.Button5Click(Sender: TObject); var LoadStream : TMemoryStream; begin...

CDialogEx + dll, После завершения модального диалога (CDialogEx) из длл-библиотеки работа длл-библиотеки прерывается
Добрый день, подскажите, пожалуйста, новичку с++/mfc. Работаю в VS 2010. Есть необходимость...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru