4

DLL として利用できるトレース ライブラリを作成しています。システム内の基本的にすべてのコンポーネントで消費されます。注意が必要な要件の 1 つは、トレース関数をプロセスの有効期間の非常に早い段階 (main() が実行される前であっても) に呼び出す必要があることです。

このライブラリのコンシューマーには、実行可能ファイル、静的にリンクされた DLL、遅延ロードされた DLL、および動的にロードされた DLL が含まれます。すべてのバリエーション。

一部のトレース機能は、静的初期化ではうまく機能しませんが、他の機能は問題ありません。理想的には、初期化時に最小限の安全な機能を消費者に提供し、初期化が完了した後に完全な機能を提供できるようにしたいと考えています。

特定のコンシューマーは DLL 自体であり、それらをホストする実行可能ファイルを制御できないため、コンシューマーに明示的な "I'm done init" 呼び出しを行うように依頼しても機能しません。同じ問題がチェーンを 1 レベル上に移動するだけです。

私が望んでいるのは、現在静的初期化で実行しているかどうか、またはその段階が完了しているかどうかをランタイムに問い合わせる方法があることです。そのようなことは可能ですか?

さらに複雑なことに、5 つのプラットフォームで実行する必要があります。一度だけのソリューションは必要ありませんが、すべてのプラットフォームで何らかの形で機能させる必要があります。

4

3 に答える 3

1

グローバル変数?何かのようなもの:

bool initTime = true;

DLLに入れてから

int main()
{
  initTime = false;
  // your main code comes here
}

実行可能ファイルで。

于 2010-07-20T20:01:22.360 に答える
0

あなたはそれを書きます

一部のトレース機能は、静的初期化ではうまく機能しませんが、他の機能は問題ありません。

ただし、ほとんどの場合、問題は実行可能ファイル (プロセス) の静的初期化フェーズではなく、DLL の静的初期化フェーズにあります。すべての DLL には、静的 C++ オブジェクト用の独自の静的初期化フェーズがあることに注意する必要があります。具体的には、トレース DLL も同様であり、DLL を使用する可能性のある他の DLL も同様です。

要約すると、おそらく、実行可能ファイルの静的初期化フェーズが終了したかどうかは気にしませんが、a) 独自の DLL の初期化が完了したかどうか、および b) DLL を呼び出している間にローダー ロックが現在保持されているかどうかは気にします。

a) DLL の初期化が完了した場合、初期化される前に誰も DLL を呼び出すことができないため、コード内の問題のみです。

b) に関しては、ローダー ロックが現在保持されているかどうかをコードから判断する (移植可能で文書化された) 方法はないようです。ローダーロックが保持されている間、どの関数を呼び出してはならないかを明確に文書化する以外に方法はありません。

于 2010-07-21T15:22:19.303 に答える
0

書き直して (まあ、変更して)、書き直した crt0.o にリンクする必要があるかもしれません。これは明らかに、プラットフォームごとに異なる必要があります。

于 2010-07-21T16:18:58.937 に答える