Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];

Вниз

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

 
kull   (2002-10-04 12:08) [0]

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


 
qube   (2002-10-04 12:12) [1]

Этот вопрос на неделе был, поищи.


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

kull © (04.10.02 12:08)

Как обычно, глупый вопрос - а нафига ?

В зависимости от ответа возможны разные пути решения.


 
AndreyS   (2002-10-04 12:26) [3]

Если просто названия функций, то открывайте простой текстовый редактор и смотрите текст
dll в символном представлении и ближе к концу файла вы увидете его, родимого.


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


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

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

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


>
> AndreyS © (04.10.02 12:26)

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


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

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

С уважением,


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

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


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

Best Before 2024 (04.10.02 13:35)

:-)


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

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


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

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


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

qube © (04.10.02 13:37)

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


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

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


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

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


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

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

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;


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

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


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

Digitman © (04.10.02 13:50)

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

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

С уважением,


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

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

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

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

С уважением,


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

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

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


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


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

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

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

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


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

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


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

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


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

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


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

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



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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.10.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.008 c
1-45296
race1
2002-10-04 16:52
2002.10.14
колонки


3-45216
AFrolov
2002-09-23 17:26
2002.10.14
Как узнать какие таблицы есть в базе данных MS Access


1-45377
amo
2002-10-05 13:11
2002.10.14
изменить ресурсы в EXE


4-45651
Soul2
2002-08-31 01:46
2002.10.14
ОКНА


14-45566
Андрей Прокофьев
2002-09-19 13:43
2002.10.14
Version Control Systems





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский