Содержимое Run-Time Package
От: BaSergey Россия  
Дата: 29.07.02 11:44
Оценка:
Есть Run-Time Package, в нем форма и несколько процедур в interface.
Можно ли после вызова LoadPackage каким-либо способом получить адрес этих процедур (и естественно запустить их)?
Именно процедур, а не классов.
Попутно — кто-нибудь пробовал во время работы программы, написанной на Delphi6, использовать DPL-ы от Delphi3?
ICQ 153965498
Re: Содержимое Run-Time Package
От: Алексей Петров Россия  
Дата: 29.07.02 11:47
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Есть Run-Time Package, в нем форма и несколько процедур в interface.

BS>Можно ли после вызова LoadPackage каким-либо способом получить адрес этих процедур (и естественно запустить их)?
BS>Именно процедур, а не классов.
BPL это в общем dll с наваротами. Послн того, как загрузил — можешь обычный GetProcAddress использовтаь. Только имя функций (процедур) декорируется — просмотри для начала любым Viewer-ом список экспорта, чтоб точно знать имя.

BS>Попутно — кто-нибудь пробовал во время работы программы, написанной на Delphi6, использовать DPL-ы от Delphi3?

А вот этого не стоит. Очень хреново получится при попытки загружать.
Re[2]: Содержимое Run-Time Package
От: BaSergey Россия  
Дата: 29.07.02 11:55
Оценка:
Здравствуйте Алексей Петров, Вы писали:

АП>BPL это в общем dll с наваротами. Послн того, как загрузил — можешь обычный GetProcAddress использовтаь. Только имя функций (процедур) декорируется — просмотри для начала любым Viewer-ом список экспорта, чтоб точно знать имя.


Ок, Имя прцедуры в TDUMP смотрится как "unit.procedure_name@address". Я пробовал давать GetProcAddress-у параметр того жке вида (unit.procedure_name), но безуспешно. Я все правильно делаю?

АП>А вот этого не стоит. Очень хреново получится при попытки загружать.


А как раз это у меня идет без проблем. И на загрузку, и на выгрузку.
ICQ 153965498
Re[3]: Содержимое Run-Time Package
От: Алексей Петров Россия  
Дата: 29.07.02 12:05
Оценка:
Здравствуйте BaSergey, Вы писали:


BS>Ок, Имя прцедуры в TDUMP смотрится как "unit.procedure_name@address". Я пробовал давать GetProcAddress-у параметр того жке вида (unit.procedure_name), но безуспешно. Я все правильно делаю?

Я ковырял для D5 — там было чуть сложнее с декорацией:
@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}


АП>>А вот этого не стоит. Очень хреново получится при попытки загружать.


BS>А как раз это у меня идет без проблем. И на загрузку, и на выгрузку.

Проблема в том, что у D3 Object совсем другой, чем в D6 — если у тебя будет к.л. взаимодействие этих объектов — будет кирдык.
Если же bpl варится сам, не показывает никаних форм и все параметры используемых процедур только простых типов — то все более-менее ОК. Если не считать загрузки дублирующихся bpl-ей (vcl30.bpl и vcl60.bpl)
Re[4]: Содержимое Run-Time Package
От: BaSergey Россия  
Дата: 29.07.02 12:10
Оценка:
Здравствуйте Алексей Петров, Вы писали:

АПАП>Я ковырял для D5 — там было чуть сложнее с декорацией:

АП>
АП>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}
АП>


Это ладно, но как вызвать-то?
ICQ 153965498
Re[5]: Содержимое Run-Time Package
От: Алексей Петров Россия  
Дата: 29.07.02 12:11
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Здравствуйте Алексей Петров, Вы писали:


АПАП>>Я ковырял для D5 — там было чуть сложнее с декорацией:

АП>>
АП>>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}
АП>>


BS>Это ладно, но как вызвать-то?


Ты GetProcAddress-ом адрес получил? Если да, то вызывай по этому адресу.
Re[6]: Содержимое Run-Time Package
От: BaSergey Россия  
Дата: 29.07.02 12:19
Оценка:
Здравствуйте Алексей Петров, Вы писали:


АП>Ты GetProcAddress-ом адрес получил? Если да, то вызывай по этому адресу.


В том и весь мой вопрос. С обычными DLL проблем нет, но там и экспортное имя простое. А тут вон что творится...
>>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}
Что, так прямо и писать:
GetProcAddress('@unit@procedure_name...', ...)
? Я пробовал, не идет. Я все правильно делаю? А как быть с СоглашениемОВызовах и ПеречнемПараметров?
ICQ 153965498
Re[7]: Содержимое Run-Time Package
От: Алексей Петров Россия  
Дата: 29.07.02 12:46
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Здравствуйте Алексей Петров, Вы писали:



АП>>Ты GetProcAddress-ом адрес получил? Если да, то вызывай по этому адресу.


BS>В том и весь мой вопрос. С обычными DLL проблем нет, но там и экспортное имя простое. А тут вон что творится...

>>>@{Модуль}@{ИмяФункции}$q{СоглашениеОВызовах}{ПереченьПараметров}
BS>Что, так прямо и писать:
GetProcAddress('@unit@procedure_name...', ...)
? Я пробовал, не идет. Я все правильно делаю? А как быть с СоглашениемОВызовах и ПеречнемПараметров?


Нет. Писать в точности, как в таблице экмпорта.
Что значит не идет?
GetProcAddress что возвращает. Если nil, что после этого возвращает GetLastError?
Re[8]: Содержимое Run-Time Package
От: BaSergey Россия  
Дата: 29.07.02 13:12
Оценка:
Здравствуйте Алексей Петров!
БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!

Ни в жизнь бы не догадался сам. И еще несколько вопросов:

— прошел вариант
@Proc:= GetProcAddress(Pack, 'P_Work.PaymentWork@003CDF78');

А что это такое после "@"? Изменяется ли ЭТО после новой сборки DPL?

— GetLastError + FormatMessage после GetProcAddress выдают "The handle is invalid", но все работает! С чего бы вдруг?

И самый важный вопрос — где почитать подробностей на эту тему? Откуда Вы об этом узнали?
ICQ 153965498
Re[9]: Содержимое Run-Time Package
От: Алексей Петров Россия  
Дата: 30.07.02 06:18
Оценка:
Здравствуйте BaSergey, Вы писали:

BS>Здравствуйте Алексей Петров!

BS>БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
Тут вместо спасибо принято оценки ставить

BS>Ни в жизнь бы не догадался сам. И еще несколько вопросов:


BS>- прошел вариант

BS>
@Proc:= GetProcAddress(Pack, 'P_Work.PaymentWork@003CDF78');

BS>А что это такое после "@"? Изменяется ли ЭТО после новой сборки DPL?
Я не изучал старые пакеты, потому не знаю точно. Но по виду это похоже на адрес. А если так — то после пересборки имя изменится.
Могу предложить искать по шаблону в таблице импорта нужное имя — тогда результат не будет зависить от сборки.

BS>- GetLastError + FormatMessage после GetProcAddress выдают "The handle is invalid", но все работает! С чего бы вдруг?


GetLastError есть смысл вызывать только в том случаи, если @Proc=nil — иначе он мусор возвращает.

BS>И самый важный вопрос — где почитать подробностей на эту тему? Откуда Вы об этом узнали?

Немного информации есть в исходниках, поставляемвх с Delphi. Есть в MSDN документация по структуре PE-файла. А дальши — простор для исследования
Re[10]: Содержимое Run-Time Package
От: Anatolix Россия https://www.linkedin.com/in/anatolix/
Дата: 01.08.02 11:12
Оценка:
Вызывайте tdump с ключем -m и подставляете
функции как он вам их напишет
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.