3


プロセスの開始時に dll を挿入するアプリケーションに取り組んでいます (サスペンド --> 挿入 --> 再開)デバッグ目的で)。ただし、この MessageBox() への呼び出しは、エラーをポップして、挿入されたプロセスをクラッシュさせることがあります。

ランタイムエラー!
プログラム: C:\Program Files\Microsoft Office\Office14\OUTLOOK.EXE

R6030
- CRT が初期化されていません

これは、たとえば Outlook や Winword で再現できます。メモ帳、IE、CMD、Calc など、メッセージ ボックスを出力して通常どおり続行します。

メッセージ ボックスを印刷することは私にとって必須ではないので、CRT が初期化を完了したかどうかを確認できるようにしたいだけなので、次のように通常どおり続行できます。

case DLL_PROCESS_ATTACH:
     if (IsCRTInitialized())
        MessageBox(...);

情報が不足している場合はお知らせください。ありがとう!

4

2 に答える 2

3

エントリポイント関数DLLMainが呼び出されると、Kernel32.dll がプロセス アドレス空間に読み込まれることが保証されます。MessageBoxはuser32.dllに常駐し、user32.dllから関数を呼び出すDLL を作成するためのベスト プラクティスによると、厳密には禁止されています。

次のいずれかを実行できます

  1. デバッガーのトレースに対してOutputDebugStringを呼び出します。この関数は kernel32.dll にあり、安全に呼び出すことができます。

  2. アプリケーションが他の dll をロードする前に、自分でMessageBoxを呼び出します。これにより、user32.dll とその依存関係が既に読み込まれていることが保証されます。このように DllMain でMessageBoxを呼び出すと、成功する可能性が高くなります。しかし、走行距離は異なる場合があります。

于 2011-11-22T12:45:28.863 に答える
2

問題は CRT ではありません。MessageBoxからの呼び出しやその他の重要な機能は許可されていませんDllMain

于 2011-11-22T11:49:33.937 に答える