Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Paquetes dinámicos! (https://www.clubdelphi.com/foros/showthread.php?t=64572)

Neftali [Germán.Estévez] 19-04-2009 23:42:01

Cita:

Empezado por BlackDaemon (Mensaje 344891)
por cierto, di tengo 3 componentes en el bpl, y desde mi form principal quiero crear uno, ¿cómo sabría los nombres de los componentes que tengo en el bpl ?
osea, sus nombres, métodos, etc, algo así como hace delphi que te muestra mientras vas escribiendo, si esto lo hace automáticamente retiro la pregunta.
Pero mi idea era crear una especie de api que me permita saber los nombres de los componentes del bpl y sus propiedades, etc


Bueno, los nombres de las clases pueden obtenerse, es cuestión de investigar cómo...
Esta imagen, por ejemplo, es de un programa que permite "explorar" ejecutables y BPL's.

A partir de ahí y con RTTI podrías obtener métodos.

BlackDaemon 20-04-2009 05:35:38

Hola

interesante el programa, pero me gustaría saber cómo lo haces, osea, es imágen es justamente lo que quiero hacer, a ver si pones el código que hace todo eso, está interesante realmente

Adiós y muchas gracias ;)

Neftali [Germán.Estévez] 20-04-2009 09:41:34

Este programa no es mío, es Dede. Pero, es básicamente lo que hace Delphi cuando instalas un packages.
Lo que quería hacer notar, es que se puede hacer, pero desgraciadamente no tengo el código. :o

Neftali [Germán.Estévez] 20-04-2009 11:50:47

Utilizando el TDump que viene con Delphi:

(con el package que ya hemos creado)
Código:

tdump  -ee b:\pExEdit.bpl > b:\out.txt
Se puede obtener una salida como esta:

EXPORT ord:0007='__tpdsc__ Calignedit::TAlignEdit'
EXPORT ord:0020='__tpdsc__ Ceditinsidehelp::TEditInsideHelp'
EXPORT ord:0002='__fastcall Calignedit::Finalization()'
EXPORT ord:0003='__fastcall Calignedit::Register()'
EXPORT ord:0008='Calignedit::TAlignEdit::'
EXPORT ord:0006='__fastcall Calignedit::TAlignEdit::TAlignEdit(Classes::TComponent *)'
EXPORT ord:0005='__fastcall Calignedit::TAlignEdit::CreateParams(Controls::TCreateParams&)'
EXPORT ord:0004='__fastcall Calignedit::TAlignEdit::SetAlignment(const Classes::TAlignment)'
EXPORT ord:0001='__fastcall Calignedit::initialization()'
EXPORT ord:0010='__fastcall Ceditinsidehelp::Finalization()'
EXPORT ord:0019='__fastcall Ceditinsidehelp::Register()'
EXPORT ord:0021='Ceditinsidehelp::TEditInsideHelp::'
EXPORT ord:0017='__fastcall Ceditinsidehelp::TEditInsideHelp::TEditInsideHelp(Classes::TComponent *)'
EXPORT ord:0016='__fastcall Ceditinsidehelp::TEditInsideHelp::~TEditInsideHelp()'
EXPORT ord:0018='__fastcall Ceditinsidehelp::TEditInsideHelp::CMExit(Messages::TWMNoParams&)'
EXPORT ord:0015='__fastcall Ceditinsidehelp::TEditInsideHelp::InsideHelpFontChange(System::TObject *)'
EXPORT ord:0014='__fastcall Ceditinsidehelp::TEditInsideHelp::SetInsideHelpActive(const bool)'
EXPORT ord:0013='__fastcall Ceditinsidehelp::TEditInsideHelp::SetInsideHelpFont(const Graphics::TFont *)'
EXPORT ord:0012='__fastcall Ceditinsidehelp::TEditInsideHelp::SetInsideHelpText(const System::AnsiString)'
EXPORT ord:0011='__fastcall Ceditinsidehelp::TEditInsideHelp::WMPaint(Messages::TWMPaint&)'
EXPORT ord:0009='__fastcall Ceditinsidehelp::initialization()'
EXPORT ord:0028='GetPackageInfoTable'
EXPORT ord:0025='Pexedit::__linkproc__ __fastcall GetPackageInfoTable()'
EXPORT ord:0024='Pexedit::__linkproc__ __fastcall PackageLoad()'
EXPORT ord:0023='Pexedit::__linkproc__ __fastcall PackageUnload()'
EXPORT ord:0022='__fastcall Pexedit::initialization()'
EXPORT ord:0026='Finalize'
EXPORT ord:0027='Initialize'


Neftali [Germán.Estévez] 20-04-2009 11:55:02

Esta me ha llamado la atención... :D:D

EXPORT ord:0025='Pexedit::__linkproc__ __fastcall GetPackageInfoTable()'

Neftali [Germán.Estévez] 20-04-2009 14:06:50

...Estoy peleandome con ello. ;)

Neftali [Germán.Estévez] 21-04-2009 13:01:09

Pues listo.
Peleando un poco hemos llegado hasta aquí. Me ha parecido demasiado largo, así que he creado una entrada explicando copn detalle todo el proceso e incluyendo las imágenes y los ejemplos.
Con el código que se muestra, se puede saber qué clases hay definidas en un package.

Al final la clave ha estado en la clase que implementa Delphi llamada TClassFinder. Y que curiosamente no es la primera vez que aparece en los foros (Al, ¿Quien, sino?).


La franja horaria es GMT +2. Ahora son las 02:42:23.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi