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

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

13.11.2012, 11:47. Показов 9563. Ответов 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
8489 / 6156 / 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
8489 / 6156 / 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
8489 / 6156 / 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
8489 / 6156 / 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
8489 / 6156 / 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
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru