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

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

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

Студворк — интернет-сервис помощи студентам
Имеется стандартная библиотека 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
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.09.2016, 15:34
Ответы с готовыми решениями:

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

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

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

8
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.09.2016, 15:51
А не проще ли подключить setupapi.lib и вызвать функцию напрямую
(раннее связывание dll)?
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
29.09.2016, 17:27  [ТС]
У меня нет setupapi.lib, f pkst zpsrb говорят, что набор функций отдельно взятой версии setupapi.lib может не совпадать с setupapi.dll, аналогично и с другими dll.
Посему и корячусь так.
0
Ушел с форума
Эксперт С++
 Аватар для Убежденный
16481 / 7444 / 1187
Регистрация: 02.05.2013
Сообщений: 11,616
Записей в блоге: 1
29.09.2016, 17:39
Цитата Сообщение от 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  [ТС]
Уу, была где то 6 студия, попробую из нее выудить, а так то codeblocks пользуюсь.
0
415 / 150 / 48
Регистрация: 02.06.2016
Сообщений: 364
29.09.2016, 19:28
Цитата Сообщение от leshafree Посмотреть сообщение
У меня нет setupapi.lib
Цитата Сообщение от leshafree Посмотреть сообщение
а так то codeblocks пользуюсь
Должна быть в codeblocks (точнее конечно в mingw), только она называется libsetupapi.a
0
2 / 2 / 4
Регистрация: 31.03.2015
Сообщений: 38
30.09.2016, 14:44  [ТС]
Да?? Спасибо за наводку, погляжу завтра.

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

Добавлено через 3 минуты
Цитата Сообщение от GoshaM Посмотреть сообщение
В меню Project->Buid options...
В открывшемся диалоге должно быть выделено название проекта, а не сборки (левый верхний угол).
Закладка Linker settings
Кнопка Add
Вводится название setupapi
ОО, вот это я понимаю инструкция) Спасибо! Едем дальше.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.09.2016, 15:22
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru