Есть Run-Time Package, в нем форма и несколько процедур в interface.
Можно ли после вызова LoadPackage каким-либо способом получить адрес этих процедур (и естественно запустить их)?
Именно процедур, а не классов.
Попутно — кто-нибудь пробовал во время работы программы, написанной на Delphi6, использовать DPL-ы от Delphi3?
Здравствуйте BaSergey, Вы писали:
BS>Есть Run-Time Package, в нем форма и несколько процедур в interface. BS>Можно ли после вызова LoadPackage каким-либо способом получить адрес этих процедур (и естественно запустить их)? BS>Именно процедур, а не классов.
BPL это в общем dll с наваротами. Послн того, как загрузил — можешь обычный GetProcAddress использовтаь. Только имя функций (процедур) декорируется — просмотри для начала любым Viewer-ом список экспорта, чтоб точно знать имя.
BS>Попутно — кто-нибудь пробовал во время работы программы, написанной на Delphi6, использовать DPL-ы от Delphi3?
А вот этого не стоит. Очень хреново получится при попытки загружать.
Здравствуйте Алексей Петров, Вы писали:
АП>BPL это в общем dll с наваротами. Послн того, как загрузил — можешь обычный GetProcAddress использовтаь. Только имя функций (процедур) декорируется — просмотри для начала любым Viewer-ом список экспорта, чтоб точно знать имя.
Ок, Имя прцедуры в TDUMP смотрится как "unit.procedure_name@address". Я пробовал давать GetProcAddress-у параметр того жке вида (unit.procedure_name), но безуспешно. Я все правильно делаю?
АП>А вот этого не стоит. Очень хреново получится при попытки загружать.
А как раз это у меня идет без проблем. И на загрузку, и на выгрузку.
BS>Ок, Имя прцедуры в TDUMP смотрится как "unit.procedure_name@address". Я пробовал давать GetProcAddress-у параметр того жке вида (unit.procedure_name), но безуспешно. Я все правильно делаю?
Я ковырял для D5 — там было чуть сложнее с декорацией:
АП>>А вот этого не стоит. Очень хреново получится при попытки загружать.
BS>А как раз это у меня идет без проблем. И на загрузку, и на выгрузку.
Проблема в том, что у D3 Object совсем другой, чем в D6 — если у тебя будет к.л. взаимодействие этих объектов — будет кирдык.
Если же bpl варится сам, не показывает никаних форм и все параметры используемых процедур только простых типов — то все более-менее ОК. Если не считать загрузки дублирующихся bpl-ей (vcl30.bpl и vcl60.bpl)
АП>Ты GetProcAddress-ом адрес получил? Если да, то вызывай по этому адресу.
В том и весь мой вопрос. С обычными DLL проблем нет, но там и экспортное имя простое. А тут вон что творится... >>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}
Что, так прямо и писать:
GetProcAddress('@unit@procedure_name...', ...)
? Я пробовал, не идет. Я все правильно делаю? А как быть с СоглашениемОВызовах и ПеречнемПараметров?
Здравствуйте BaSergey, Вы писали:
BS>Здравствуйте Алексей Петров, Вы писали:
АП>>Ты GetProcAddress-ом адрес получил? Если да, то вызывай по этому адресу.
BS>В том и весь мой вопрос. С обычными DLL проблем нет, но там и экспортное имя простое. А тут вон что творится... >>>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров} BS>Что, так прямо и писать:
GetProcAddress('@unit@procedure_name...', ...)
? Я пробовал, не идет. Я все правильно делаю? А как быть с СоглашениемОВызовах и ПеречнемПараметров?
Нет. Писать в точности, как в таблице экмпорта.
Что значит не идет?
GetProcAddress что возвращает. Если nil, что после этого возвращает GetLastError?
Здравствуйте BaSergey, Вы писали:
BS>Здравствуйте Алексей Петров! BS>БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
Тут вместо спасибо принято оценки ставить
BS>Ни в жизнь бы не догадался сам. И еще несколько вопросов:
BS>- прошел вариант BS>
BS>А что это такое после "@"? Изменяется ли ЭТО после новой сборки DPL?
Я не изучал старые пакеты, потому не знаю точно. Но по виду это похоже на адрес. А если так — то после пересборки имя изменится.
Могу предложить искать по шаблону в таблице импорта нужное имя — тогда результат не будет зависить от сборки.
BS>- GetLastError + FormatMessage после GetProcAddress выдают "The handle is invalid", но все работает! С чего бы вдруг?
GetLastError есть смысл вызывать только в том случаи, если @Proc=nil — иначе он мусор возвращает.
BS>И самый важный вопрос — где почитать подробностей на эту тему? Откуда Вы об этом узнали?
Немного информации есть в исходниках, поставляемвх с Delphi. Есть в MSDN документация по структуре PE-файла. А дальши — простор для исследования
Вызывайте tdump с ключем -m и подставляете
функции как он вам их напишет
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев