1

私は DirectX10 ゲーム エンジンで忙しく、DirectX とは関係のない問題を抱えています :P 問題は、エンジンを含む DLL で、通常の win32 で行うのと同じように、DialogBox が呼び出されることがあることです。 . HINSTANCE の代わりに、DLL をロードするときに取得する HMODULE を使用するという唯一の違いがあります。

F10 (Visual C++ 2008) を使用してコードをステップ実行すると、すべて正常に動作しているように見えますが、DlgMessageProc 関数を通過し、実行する必要があるすべてのことを実行することさえできます。唯一の奇妙なことは、ダイアログが表示されず、突然メッセージ ループから飛び出し、残りのコードを続行することです。

DLL の内部から MessageBox を呼び出すときに同じ問題が発生しますが、エラーは発生しません。

面白いのは、私と同じ基本アーキテクチャを使用する本からのコードがいくつかあり、コンパイルするとすべてがうまく表示されるということです??

だから私の質問は、隠しオプション、pragama コメント、または Dll から MessageBoxes とダイアログを表示できるようにしたい場合に見るべき他のものはありますか?

4

2 に答える 2

0

ダイアログ リソースのビジュアル スタジオ リソース エディターのプロパティ ページには、「No Fail Create: True」を指定できるオプションが必要です。

通常、コモン コントロールを作成できないため、ダイアログの作成に失敗します。通常は、InitCommonControlsEx が呼び出されていないためです。No Fail Create フラグを設定すると、ダイアログが表示され、欠落しているコントロールを特定できます。


その他の確認事項:

  • 最初のチャンスの例外に関するメッセージがデバッグ ウィンドウに表示されますか? おそらく、例外がキャッチされ、Win32 によって静かに処理されているために、「飛び出して」いるのでしょう。Dev Studio の例外ダイアログで最初のチャンスの win32 例外のデバッグをオンにして、それを追跡します。

    これでも、MessageBox 呼び出しがメッセージ ボックスの作成に失敗する理由は説明できません。

  • MessageBox が機能しないのを見たのは、次の場合だけでした。

    1. リソース リークにより、プロセスで使用可能な user32 ハンドルが不足していました。タスク マネージャーを使用してアプリのハンドル数を確認しましたか?
    2. システムはシャットダウン中です。PostQuitMessage を呼び出してから、ダイアログ/メッセージ ボックスを作成しようとしましたか?
于 2009-09-05T17:39:43.937 に答える
0

いいえ、マニフェストを変更してもまったく役に立ちません。また、ダイアログとそのproc関数をテストするだけの別のプロジェクトを作成し、そこですべてが完璧に機能します(dllではなく.exeへのリンク)

于 2009-09-05T17:51:46.660 に答える