Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.89/46: Рейтинг темы: голосов - 46, средняя оценка - 4.89
0 / 0 / 0
Регистрация: 21.10.2012
Сообщений: 33

Просмотр функций dll

13.11.2012, 11:47. Показов 9288. Ответов 42
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
как посмотреть весь список функций и их параметров в dll???

Добавлено через 32 минуты
при динамическом подключении dll из темы DLL, ошибка Cannot convert 'char *' to 'char'
выводит ShowMessage("Невозможно найти функцию getFloatValues");
хотя знаю, что название функции написано правильно. В чем еще может быть причина?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.11.2012, 11:47
Ответы с готовыми решениями:

Использование функций из DLL
Всем привет! В С++ я новичек, долго пытался разобраться, но, видимо, без помощи никак. Иммется DLLка (для работы с оборудованием и...

Использование функций из других .dll
Всем добрый вечер. Ребята такая просьба у меня есть дллка написанная на дельфи. Как мне ее подключить и использовать оттуда функции? На...

Как узнать список функций dll библиотеки?
как узнать список функций dll библиотеки? Возможно ли ето в класическом с++?

42
0 / 0 / 0
Регистрация: 21.10.2012
Сообщений: 33
14.11.2012, 13:04  [ТС]
Студворк — интернет-сервис помощи студентам
всем спасибо за помощь, dll работает!!!

Добавлено через 3 часа 29 минут
вот такой вопрос, если при нажатии одной кнопки я динамически загрузил dll, использовал нужную функцию, выгрузил функцию. В другой кнопке я вызываю другую функцию из этой dll, то мне опять писать весь этот же алгоритм???
0
14.11.2012, 13:18

Не по теме:

builderf, хоть выложил бы код кнопки. Подытожил бы топик для будущих поколений.

0
0 / 0 / 0
Регистрация: 21.10.2012
Сообщений: 33
14.11.2012, 13:56  [ТС]
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
void __fastcall TMainForm::Button3Click(TObject *Sender)
{
 
 InfoForm->InfoMemo->Clear();
 OID1=StrToInt(Edit2->Text);
 StatusBar1->SimpleText="Чтение регистра";
//dll чтение
const char * bibl =  (Edit5->Text+".DLL").c_str() ;
   void (*Message) (char const *,unsigned short,unsigned short,float *) ;
 
     HINSTANCE dllp = LoadLibrary(bibl);
    if (dllp) {
      const char * lpProcName = "?getFloatValues@@YAHPBDGGPAM@Z";
      char *T1 = "MPU";
      float nResult;
      Message = (void(*)(char const *,unsigned short,unsigned short,float *))
        GetProcAddress(dllp,lpProcName) ;
      if (Message) {
      Message(T1,OID1,1,EthernetBuffer);
      nResult = EthernetBuffer[0];
      }
      else ShowMessage("Невозможно найти функцию");
      Edit4->Text = FloatToStrF(nResult,ffFixed,5,3);
 
    }
    else ShowMessage("Невозможно подключить dll");
   FreeLibrary(dllp);
//end  dll
}
моя кнопка под первый вызов функции

вот такой вопрос, если при нажатии одной кнопки я динамически загрузил dll, использовал нужную функцию, выгрузил функцию. В другой кнопке я вызываю другую функцию из этой dll, то мне опять писать весь этот же алгоритм???

Добавлено через 31 минуту
Вообщем разобрался, все работает, окончательный вариант, мб кому-то понадобится
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
void __fastcall TMainForm::Button3Click(TObject *Sender)
{
 
 InfoForm->InfoMemo->Clear();
 OID1=StrToInt(Edit2->Text);
 StatusBar1->SimpleText="Чтение регистра";
//dll чтение
const char * bibl =  "MPUBComm.dll";
   void (*Message) (char const *,unsigned short,unsigned short,float *) ;
 
     HINSTANCE dllp = LoadLibrary(bibl);
    if (dllp) {
      const char * lpProcName = "?getFloatValues@@YAHPBDGGPAM@Z";
      char *T1 = "MPU";
      float nResult;
      Message = (void(*)(char const *,unsigned short,unsigned short,float *))
        GetProcAddress(dllp,lpProcName) ;
      if (Message) {
      Message(T1,OID1,1,EthernetBuffer);
      nResult = EthernetBuffer[0];
      }
      else ShowMessage("Невозможно найти функцию");
      Edit4->Text = FloatToStrF(nResult,ffFixed,5,3);
 
    }
    else ShowMessage("Невозможно подключить dll");
   FreeLibrary(dllp);
//end  dll
}
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.11.2012, 03:41
Цитата Сообщение от builderf Посмотреть сообщение
В другой кнопке я вызываю другую функцию из этой dll, то мне опять писать весь этот же алгоритм???
В общем скачал dll-ку подправленную _lucius_ https://www.cyberforum.ru/post3692454.html
( далее см инфу из моего блога https://www.cyberforum.ru/blog... og478.html )

Создал h- файл по данным о сигнатуре ф-ций полученных PEExplorer
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#ifndef MPUBCommH
#define MPUBCommH
//---------------------------------------------------------------------------
//  [url]https://www.cyberforum.ru/cpp-builder/thread696209.html[/url]
//---------------------------------------------------------------------------
#define DLL_SPEC extern "C" __declspec(dllimport)
 
DLL_SPEC int __cdecl getFloatValues(char const *,unsigned short,unsigned short,float *);
DLL_SPEC int __cdecl getIntValues(char const *,unsigned short,unsigned short,int *);
DLL_SPEC int __cdecl setFloatValues(char const *,unsigned short,unsigned short,float *);
DLL_SPEC int __cdecl setIntValues(char const *,unsigned short,unsigned short,int *);
DLL_SPEC int __cdecl testTheDLL1(void);
DLL_SPEC int __cdecl testTheDLL2(unsigned short,unsigned short);
//---------------------------------------------------------------------------
#endif
Создал def -файл



И подправил его под соглашение __cdecl для Builder-а ( см http://www.rsdn.ru/article/devtools/bcbdll.xml )

Code
1
2
3
4
5
6
7
8
9
LIBRARY     MPUBCOMM.DLL
 
EXPORTS
    _getFloatValues=getFloatValues  @1   ; getFloatValues
    _getIntValues=getIntValues       @2   ; getIntValues
    _setFloatValues=setFloatValues  @3   ; setFloatValues
    _setIntValues=setIntValues        @4   ; setIntValues
    _testTheDLL1=testTheDLL1        @5   ; testTheDLL1
    _testTheDLL2=testTheDLL2        @6   ; testTheDLL2
Создал lib-файл с помощью утилиты из VC++ 2010




lib и h подключил к проекту

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
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//----------------------------------
#include "MPUBComm.h"
#pragma comment(lib,"MPUBComm-bcb.lib")
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
const char SERVERADDR[] = "127.0.0.1";
 
float A[50];
int OID1=0;
 
getFloatValues(SERVERADDR,OID1,1,A);
}
//---------------------------------------------------------------------------
Вложения
Тип файла: rar MPUBComm.rar (1.99 Мб, 10 просмотров)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.11.2012, 03:52
Цитата Сообщение от Avazart Посмотреть сообщение
Создал lib-файл с помощью утилиты из VC++ 2010
Поправочка implib.exe из Builder, а не с VC++ 2010 ( перепутал с утилитой lib.exe )

_lucius_, у меня такой вопрос чем вы подправляли имена ф-ций в dll ?

Добавлено через 3 минуты
Чем можно подправлять это
Декодирование имён экспортируемых функций
Возвращение осмысленного вида декорированным именам

Библиотеки DLL, написанные на C++, часто экспортируют функции с совершенно нечитабельными, так называемыми decorated ("декорированными") именами. Иногда эти имена ещё называют mangled - т.е. "искажённые" или "испорченные".

Происходит это из-за того, что язык C++ позволяет программисту давать разным объектам одинаковые имена. В результате компоновщик генерирует странно выглядящие, но зато уникальные внешние имена функций, в которых закодирована информация о типах принимаемых и возвращаемых переменных.

Таким образом, "декорация" имён гарантирует, что внешние имена функций не будут совпадать и будут содержать только допустимые алфавитно-числовые символы.
Декодирование mangled имён функций

Декодирование mangled имён и возвращение им осмысленного вида затрудняется тем, что разные компиляторы используют разные схемы кодировки для генерирования внешних имён. Например, при компилировании функции:

C++
1
char * istrstream::str(void)
Компиляторы C++ от Microsoft кодируют её как:

Code
1
?str@istrstream@@QAEPADXZ
а компиляторы C++ от Borland кодируют её как:

Code
1
@std@istrstream@str$qv

PE Explorer поддерживает обе схемы декодирования внешних имён и приводит к удобочитаемому виду имена экспортируемых функций из DLL, созданных компиляторами C++ как от Microsoft, так и от Borland.
http://www.heaventools.ru/pe-explorer-unmangle.htm
1
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 06:07
Цитата Сообщение от Avazart Посмотреть сообщение
_lucius_, у меня такой вопрос чем вы подправляли имена ф-ций в dll ?
Hiew32 использовал.
Миниатюры
Просмотр функций dll   Просмотр функций dll  
1
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.11.2012, 06:11
Ну так это вроде обычный HЕX- редактор ?

А как править ?
Стирать "лишние символы" или ставить вместо них NULL-символ ?
0
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 06:21
Ну не совсем обычный. Он ведь хидер PE'шнику проанализировал. На первом скриншоте выбираю указатель на таблицу экспорта и перехажу туда. Ну и там уже не вникая имена легко найти, таблица экспорта не большая.
Цитата Сообщение от Avazart Посмотреть сообщение
Стирать "лишние символы" или ставить вместо них NULL-символ ?
Там ещё вопрос первым идет. Т.е. нужно передвинуть имя на позицию влево, затем мусор затереть нулями (можно один ноль поставить обозначив терминацию).
Цитата Сообщение от Avazart Посмотреть сообщение
Компиляторы C++ от Microsoft кодируют её как:
Код Code
1 ?str@istrstream@@QAEPADXZ
а компиляторы C++ от Borland кодируют её как:
Код Code
1 @std@istrstream@str$qv
Исходя из этого можно запросто утилитку написать которая будет имена править. Делов минут на 40. Ведь вручную не очень удобно патчить. Таблица может большой оказаться.
1
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 06:29
Вот пример правки:
Миниатюры
Просмотр функций dll  
1
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 08:07
Написал утилиту для правки имен, вот такого типа: ?str@istrstream@@QAEPADXZ
При запуске откроется диалоговое окно, в нём выбрать dll файл. Бэкап файлов не создается, так что на всякий случай dll'ку нужно сохранять самому. Исходник прилогается.
Вложения
Тип файла: zip MdNm.zip (2.0 Кб, 14 просмотров)
1
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.11.2012, 10:07
_lucius_, меня, откровенно говоря, умиляет такая хакерская отвага в деле приватизации чужих библиотек. И я не говорю даже о правовой стороне вопроса (тема копирайтов меня мало волнует), но ведь возможен вариант, когда третьестороннее или системное приложение использует эту же библиотеку. Ну хорошо, если по их числовым идентификаторам, а если по имени?
0
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 10:57
Цитата Сообщение от nick42 Посмотреть сообщение
но ведь возможен вариант, когда третьестороннее или системное приложение использует эту же библиотеку. Ну хорошо, если по их числовым идентификаторам, а если по имени?
Можно либу с поправленными именами у себя в директории разместить.

Добавлено через 24 минуты
Ну или как вариант расширить таблицу экспорта. Т.е. оставить старые и добавить новые имена.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
15.11.2012, 11:08
- просто добавить имена - недостаточно; они должны соответствовать (адресами) первородной функции. Ну, и стоит ли такая овчинка выделки? Нет, конечно с эстетической точки зрения я вас поддерживаю, но только с этой точки... .
Конечно, если длл небольшая, в системном окружении отсутствует, а вашей программе необходима, то можно ее таким образом "облагородить", даже переименовать, поместить в ресурс своего приложения и пользоваться... . Но придется забыть значение слова Copyright.
0
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
15.11.2012, 11:58
Цитата Сообщение от nick42 Посмотреть сообщение
Ну, и стоит ли такая овчинка выделки?
Не так уж сложно это сделать. Хоть и данные находятся выше по адресам, но ведь dll содержит релоки, т.е. мы можем после того как пересобрали таблицу экспорта (если пришлось сдвигать то что выше по адресу после неё) пройтись по таблицы релоков и пропатчить код ну и хидер пересобрать. Ну или более ленивый вариант создать секцию в конце и там новую таблицу экспорта собрать. Но тогда наша dll станет не совсем стандарной (ав заматерятся).

Цитата Сообщение от nick42 Посмотреть сообщение
Но придется забыть значение слова Copyright.
Вообще я и не думал чей-то копирайт нарушать. Мало ли напишу модуль на С++ и захочу из асма его юзать, а там такая абракодабра. =)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
15.11.2012, 18:15
- просто добавить имена - недостаточно; они должны соответствовать (адресами) первородной функции. Ну, и стоит ли такая овчинка выделки? Нет, конечно с эстетической точки зрения я вас поддерживаю, но только с этой точки... .
Конечно, если длл небольшая, в системном окружении отсутствует, а вашей программе необходима, то можно ее таким образом "облагородить", даже переименовать, поместить в ресурс своего приложения и пользоваться... . Но придется забыть значение слова Copyright.
Ну просто изначальную либу к примеру мне статически прилинковать не удалось... вот тебе и применение...
0
0 / 0 / 0
Регистрация: 21.10.2012
Сообщений: 33
19.11.2012, 15:17  [ТС]
эко вы разошлись
0
 Аватар для Ex_Soft
213 / 107 / 15
Регистрация: 28.01.2009
Сообщений: 481
19.11.2012, 18:48
Цитата Сообщение от builderf Посмотреть сообщение
что за символы в name кроме getfloatvalues???
Name mangling
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.11.2012, 18:53
Чет у меня так и не получилось выйти на менюшку в экспортом в Hiew32...

Неужели нет аналогичных программ по новее?
0
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
19.11.2012, 21:18
Avazart,

Перейти на RVA таблицы экспорта:
F4 -> HEX -> F8 -> F10 -> Export
Посмотреть список экспортируемых функций:
F4 -> HEX -> F8 -> F9
Редактирование:
F3 -> (редактируем) -> (F9 - сохранение изменений, Esc - отмена)
1
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
19.11.2012, 21:27
Цитата Сообщение от Avazart Посмотреть сообщение
Неужели нет аналогичных программ по новее?
Есть. CFF Explorer, там просто двойной клик по имени функции, далее сохранение через меню. Я только щас узнал, что он так умеет.
Миниатюры
Просмотр функций dll  
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
19.11.2012, 21:27
Помогаю со студенческими работами здесь

Список функций из стандартных dll библиотек (lib.exe MVS)
В общем нужен список функций (желательно и хедеров, в которых они находятся) исходя из имени стандартной библиотеки dll. Наткнулся в...

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

Использование функций DLL из другой DLL
Ребята подскажите имеется hscli.DLL hscli.LIB и hscli.H , собираю свою DLL-ку , которая использует функции hscli.DLL мои...

Просмотр кода в DLL-файлах
возможно ли с помощью каких-нибудь программ посмотреть DLL-файлы и извлечь оттуда исходный код на C# ?

Убрать из $watch() просмотр функций
Добрый день. У меня есть массив объектов. Некоторые из свойств этого объекта - это функции, которые возвращают значения на основе данных...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
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 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru