#pragma exit と #pragma startup

提供: Appmethod Topics
移動先: 案内検索

pragma 指令の概要:インデックス への移動


構文(「疑似文法」を参照)

#pragma startup FUNC [NN]
#pragma exit FUNC [NN]

説明

これら 2 つのプラグマを使用すると、プログラム起動時(メイン関数が呼び出される前)かプログラム終了時(_exit を通じてプログラムが終了する直前)のどちらかで必ず呼び出される関数をプログラムで指定することができます。

指定される関数名は、引数を取らず void を返す宣言済みの関数でなければなりません。つまり、以下のように宣言されなければなりません。

void myfunc(void);

その場合、#pragma は以下のようになります。

#pragma startup myfunc

優先度の指定

オプションの優先度パラメータ(NN)は 64 から 255 までの範囲の整数でなければなりません。

  • 最大の優先度は 0 です。
  • 優先度が高い関数ほど、起動時に最初に呼び出され、終了時に最後に呼び出されます。
  • 優先度を指定しない場合のデフォルトは、BCC32 の場合も BCC64 の場合も 100 です。

警告: BCC32 では、64 未満の優先度値を使用しないでください。0 から 63 までの優先度は、RTL の起動および停止メカニズム用に予約されています。BCC64 の場合には例外があり、それについては以下で説明しています。

64 ビット Windows アプリケーションでのユニットの初期化順序

メモ: ユニットの初期化順序は #pragma startup で指定される順序より優先されなければなりませんが、これは現時点では 64 ビット Windows 向けには実装されていません。

BCC64 ではユニットの初期化順序が使用されないので、優先度を指定せずに実行された終了時ルーチンはメイン フォームが閉じる前に終了してしまいます。BCC64 を使用している場合は、#pragma exit のルーチンが必ず __ExitVCL の後に実行されるように(また、BCC32 の動作と一致するように)、そのルーチンを優先度 30 で指定する必要があります。以下に例を示します。

 #pragma exit myfunc 30

関連項目