3

メイン アプリケーション セグメントがアンマネージド MFC であり、マネージド (C# DLL) とアンマネージド コード間の通信を橋渡しする /clr フラグでコンパイルされた C++ DLL を呼び出すように、レガシ混合 (マネージド DLL とアンマネージド DLL) アプリケーションを再編成しています。 . 残念ながら、私の変更により、アプリケーションの InitInstance() が呼び出される前にアクセス違反が発生しました。これにより、デバッグが非常に困難になります。私が得る唯一の情報は、次のスタック トレースです。

>   64006108()  
ntdll.dll!_ZwCreateMutant@16()  + 0xc bytes 
kernel32.dll!_CreateMutexW@12()  + 0x7a bytes   

だから、ここに私が試したいくつかのシナリオがあります。
- Exceptions->Win32 Exceptions->c0000005 Access Violation をオンにして、Thrown 時にブレークします。私が得る最も詳細は、上記のスタックトレースからのものです。F10 でアプリケーションを試してみましたが、ブレークポイントに到達する前に失敗し、上記のスタック トレースで失敗します。

- ブリッジ DLL をスタブ化して、bool を返すメソッドが 1 つだけになるようにし、そのメソッドが false を返すようにコーディングしました (C# コードは呼び出されません)。

bool DllPassthrough::IsFailed() { return false; }

スタブ化された DLL が /clr フラグを使用してコンパイルされている場合、アプリケーションは失敗します。/clr フラグを指定せずにコンパイルすると、アプリケーションが実行されます。

- マルチドキュメント アプリケーション用の Visual Studio ウィザードを使用してスタブ MFC アプリケーションを作成し、DllPassthrough::IsFailed() を呼び出しました。これは、DLL のコンパイルに /clr フラグを使用しても成功します。 - 次のメモAccess violation when using c++/cli

で概説されているように、winmm.lib で手動 LoadLibrary を実行しようとしました。アプリケーションはまだ失敗します。

それで、私の質問は問題を解決する方法ですか?ヒント、戦略、または以前の事件。それに失敗した場合、アクセス例外の原因となっているコード セグメントまたはライブラリに関する詳細情報を取得するにはどうすればよいでしょうか? LoadLibrary 呼び出しを行うなど、より複雑な回避策を試す場合は、失敗したライブラリに絞り込みたいと思います。

ありがとう。ところで、私たちは Visual Studio 2008 を使用しており、プロジェクトはマネージ セクションの .NET 2.0 フレームワークに対してビルドされています。

4

1 に答える 1

4

私は自分の問題を解決すると信じています。各ライブラリ参照を体系的に削除し、アプリケーション コード (アンマネージ) 内の特定のライブラリへの呼び出しをコメント アウトすることで、最終的に問題のあるライブラリを削除し、プログラムを実行できるようにしました。これは問題を診断する強引な方法であり、幸いなことに、問題を解決するためにあまりにも多くのライブラリを削除する必要はありませんでした。ライブラリがデバッガーで識別された可能性がある場合、誰かがコメントを持っているかどうか、私はまだ興味があります。
したがって、次のステップは、これらのライブラリ呼び出しをマネージ コードに移動し、ブリッジ DLL を介してアンマネージ側に情報を戻すことです。ところで、私は winmm.lib をプロジェクトに再統合しましたが、まだ機能しています。

于 2010-04-15T19:29:50.147 に答える