delphi - Dónde y cuándo se crea la instancia Application(TApplication)?
debugging initialization (2)
¿Dónde y cuándo se crea la instancia de la Application
? (Lo mismo vale para la instancia de Screen
).
No veo nada en la sección de initialization
Forms
o System
.
En las ventanas de la CPU antes de Application.Initialize
, veo una llamada a @_InitExe
(SysInit) - que conduce a _StartExe
(Sistema) y una gran cantidad de código de asm
- Que no crea la instancia de la Application
por lo que puedo decir.
¿Que me estoy perdiendo aqui?
Es bastante fácil resolver esto desde el código. Usted acaba de hacer una búsqueda de texto para TApplication.Create
. Por ejemplo, usando la característica Find in Files del IDE.
Pero siempre puedes ser flojo y obtener el depurador para hacerlo.
- Habilitar Debug DCU.
- Establezca un punto de interrupción en
TApplication.Create
. - Correr.
Cuando el programa se rompe, mira la pila de llamadas. Verá que el objeto TApplication
se TApplication
una instancia desde InitControls
en la unidad Controls
. Y InitControls
se llama desde la sección de initialization
de la unidad de Controls
.
La pila de llamadas completa para una aplicación VCL simple de vainilla se ve así:
Vcl.Forms.TApplication.Create(nil) Vcl.Controls.InitControls Vcl.Controls.Vcl.Controls System.InitUnits System._StartExe(???,???) SysInit._InitExe($5A81BC) Project1.Project1 :749933aa kernel32.BaseThreadInitThunk + 0x12 :76f09ef2 ntdll.RtlInitializeExceptionChain + 0x63 :76f09ec5 ntdll.RtlInitializeExceptionChain + 0x36
Haciendo lo mismo con TScreen.Create
, verá que el objeto TScreen
también se InitControls()
instancia en InitControls()
.
No intentaré y explicaré todo esto. Creo que aquí hay suficiente información y consejos para que puedas resolverlo todo desde aquí. Aunque esta es la pila de llamadas de una aplicación XE3, se verá igual para su aplicación Delphi 5.
La instancia de la aplicación se crea en el procedimiento InitControls de la unidad Vcl.Controls.pas.
procedure InitControls;
begin
...
Application := TApplication.Create(nil);
...
InitControls se llama en la sección de inicialización de la misma unidad:
initialization
...
InitControls;