Форум: "Основная";
Текущий архив: 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