Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Возможно ли получить список функций из dll?


Страницы:   1 2

kull ©   (2002-10-04 12:08:00) 

Привет народ!
Кто-нибудь подскажет как можно получить список экспортируемых функций из DLL?
Интересует не утилита tdump.exe, а именно программным путем.


Mystic   (2002-10-05 03:04:00) [1]

В UBPFD лежит функция, которая возвращает список экспорта DLL.


vuk   (2002-10-04 14:50:00) [2]

>Эт можно. Только получится как в анекдоте
Не получится. Все как раз получается достаточно эффективно. Скрипты хранятся в той же базе и могут быть поправлены в любой момент и если, например, обработка производится не в одном месте, а в нескольких это сразу снимает проблемы с версиями dll и т.п.


qube   (2002-10-04 14:46:00) [3]

vuk © (04.10.02 14:43)
Эт можно. Только получится как в анекдоте:
- Что ни начну писать, опять компилятор получается...


vuk   (2002-10-04 14:43:00) [4]

А может это... Для обработки скрипты приспособить? Новый формат- новый скрипт.


Игорь Шевченко   (2002-10-04 14:41:00) [5]

Тогда в каждой DLL должна быть одна функция ПреобразоватьПисьмо.
Типичный случай применения плагинов. Каждому формату письма ставится в соответствие одна DLL (хоть в ini файле, а лучше саморегистрирующаяся DLL)


kull   (2002-10-04 14:38:00) [6]


> Игорь Шевченко © (04.10.02 13:59)
>
> IMHO, из пушки по воробьям, однако. Такого рода задачи лучше
> решаются на уровне проектирования приложения.

Дело-то приблизительно вот в чем:
Все это необходимо для почтового робота. Приходит письмо с данными типа имя - значение. Его надо обработать и положить данные в базу. Форматы писем могут меняться и добавляться. Ядро почтового робота пишется один раз. А добавление и изменение форматов производится с помощью dll-ек, которые заточены каждая на свой формат почтового сообщения. Эти библиотеки просто преобразуют данные из письма в свой внутренний вид удобный для робота. При каких-то изменениях просто добавляется новая библиотека и она регестрируется в опциях робота.

А каждый раз дописывать ядро - это, мне кажется, геморой-с.

Так что "на уровне проектирования приложения" ничего не выйдет.


kull   (2002-10-04 14:21:00) [7]

Была у меня мысля в каждой dll делать функцию, которая возвращает список все доступных функций. Но я думал может как-то без нее можно.

Спасибо всем!


Digitman   (2002-10-04 14:03:00) [8]

>Игорь Шевченко

да по барабану !) надо иль не надо)

каков вопрос - таков ответ

С уважением,


Игорь Шевченко   (2002-10-04 13:59:00) [9]

Digitman © (04.10.02 13:50)

Ну да. А в DLL будут функции, которые почему-то вызывать не надо, или те DLL, функции из которых вызывать не надо. И все это на пользователя возлагать ?

IMHO, из пушки по воробьям, однако. Такого рода задачи лучше решаются на уровне проектирования приложения.

С уважением,


REA   (2002-10-04 13:51:00) [10]

Проще использовать COM наверно. Или пройтись по всем функциям (названия одинаковые) - есть, значит есть. Пользователю вредно знать про функции и пихать их в ComboBox.


Digitman   (2002-10-04 13:50:00) [11]

вот эту байду вполне можно приспособить под сию "нужду" :

function GetDLLProcAddress(lpExpModuleName, lpProcName: PChar): Pointer;
var
hExporter: THandle;
pOptHdr: PImageOptionalHeader;
pExpDir: PImageExportDirectory;
pName: PChar;
pdwNamePtr, pdwEntryPoint: PDWord;
pwOrdinalPtr: PWord;
i, nOrdinal: DWord;
begin
Result := nil;
hExporter := GetModuleHandle(lpExpModuleName);

if hExporter = 0 then
Exit;

pOptHdr := PImageOptionalHeader(hExporter + PImageDosHeader(hExporter)._lfanew + SIZE_OF_NT_SIGNATURE + IMAGE_SIZEOF_FILE_HEADER);
if (pOptHdr.NumberOfRvaAndSizes < 16) or (pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size = 0) then
Exit;

pExpDir := PImageExportDirectory(hExporter + pOptHdr.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

pdwEntryPoint := nil;
pwOrdinalPtr := PWord(hExporter + DWord(pExpDir.AddressOfNameOrdinals));

if HiWord(DWord(lpProcName)) = 0 then
begin
nOrdinal := LoWord(DWord(lpProcName)) - pExpDir.Base;
if (nOrdinal < pExpDir.NumberOfFunctions) then
pdwEntryPoint := PDWord(hExporter + DWord(pExpDir.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
end
else
begin
pdwNamePtr := PDWord(hExporter + DWord(pExpDir.AddressOfNames)) ;
//цикл по экпортируемым символьным идентификаторам
for i := 0 to pExpDir.NumberOfNames - 1 do
begin
pName := PChar(PDWord(hExporter + PDword(pdwNamePtr)^));
if lstrcmp(pName,lpProcName) = 0 then
begin
nOrdinal := pwOrdinalPtr^;
pdwEntryPoint := PDWord(hExporter + DWord(pExpDir.AddressOfFunctions) + nOrdinal * SizeOf(PDWord));
break;
end
else
begin
Inc(pdwNamePtr);
Inc(pwOrdinalPtr);
end
end;
end;
if Assigned(pdwEntryPoint) and (pdwEntryPoint^ <> 0) then
Result := Pointer(hExporter + pdwEntryPoint^);
end;


qube   (2002-10-04 13:43:00) [12]

Best Before 2024 (04.10.02 13:40)
ага


Best Before 2024   (2002-10-04 13:40:00) [13]

2 qube © (04.10.02 13:37)
Тогда в DLL - одна функция?


Игорь Шевченко   (2002-10-04 13:38:00) [14]

qube © (04.10.02 13:37)

...И возвращает список имен потенциально вызываемых функций :-)


qube   (2002-10-04 13:37:00) [15]

Можно проще:
функция называется везде одинаково, принимает одни и те же параметры, давать выбирать из списка ДЛЛ-к в определенной папке (так чаще плагины делают).


Best Before 2024   (2002-10-04 13:36:00) [16]

2 Игорь Шевченко © (04.10.02 13:34)
Ну вот, опять опередили :( :)


Игорь Шевченко   (2002-10-04 13:35:00) [17]

Best Before 2024 (04.10.02 13:35)

:-)


Best Before 2024   (2002-10-04 13:35:00) [18]

Сделайте во всех Dll функцию, которая будет возвращать список функций этой DLL :)


Игорь Шевченко   (2002-10-04 13:34:00) [19]

Если все свое, то не надо мудрить с выниманием имен функций из DLL. Проще в самой DLL сделать функцию, возвращающую список доступных имен функций.

С уважением,


kull   (2002-10-04 13:29:00) [20]


> Игорь Шевченко © (04.10.02 12:13)
>Как обычно, глупый вопрос - а нафига ?

Вопрос просто замечательный...

В приложении планируется вызывать функции из dll. Имя библиотеки (dll) будет задаваться произвольно в опциях, также будет задаваться и имя функции. Типы и количество параметров заранее заданы и одинаковы во всех функциях, т.к. динамические библиотеки тоже свои.
Так вот, хотелось бы вывести список доступных функций из выбранной библиотеки в комбобох.


>
> AndreyS © (04.10.02 12:26)

Я же говорю - программно. Т.е. средствами Delphi, через написание кода.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо