10

Applicationインスタンスはいつどこで作成されますか? (Screenインスタンスも同様) .

Formsor System initializationセクションには何も表示されません。
の前の CPU ウィンドウで、 (SysInit)Application.Initializeへの呼び出しが表示されます。これは(System) とコード全体につながります。これは、私が知る限り、インスタンスを作成しません。@_InitExe_StartExeasmApplication

ここで何が欠けていますか?

4

2 に答える 2

14

コードからこれを解決するのは簡単です。のテキスト検索を行うだけですTApplication.Create。たとえば、IDEのファイル内検索機能を使用します。

しかし、いつでも怠惰になり、デバッガーにそれを実行させることができます。

  1. デバッグDCUを有効にします。
  2. にブレークポイントを設定しますTApplication.Create
  3. 走る。

プログラムが壊れたら、コールスタックを見てください。オブジェクトがユニット内TApplicationからインスタンス化されていることがわかります。そして、ユニットのセクションから呼び出されます。InitControlsControlsInitControlsinitializationControls

プレーンなバニラVCLアプリの完全なコールスタックは次のようになります。

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

で同じことを行うと、オブジェクトもでインスタンス化されTScreen.Createていることがわかります。TScreenInitControls()

私はこれらすべてを説明しようとはしません。ここからすべてを解決するのに十分な情報とアドバイスがここにあると思います。これはXE3アプリケーションからの呼び出しスタックですが、Delphi5アプリケーションでも同じように見えます。

于 2013-02-07T17:37:09.407 に答える
12

Application インスタンスは、Vcl.Controls.pas ユニットの InitControls プロシージャで作成されます。

procedure InitControls;
begin
...
  Application := TApplication.Create(nil);
...

InitControls は、同じユニットの初期化セクションで呼び出されます。

initialization
  ...
  InitControls;
于 2013-02-07T17:39:17.113 に答える