![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Возможно ли получить список функций из dll?
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, через написание кода.