0

私はC#.Netで書かれたアプリケーションを持っています(それが重要な場合はFramework 2.0)。フォームを表示する 1 つのメソッドで COM クラスを公開する VB6 exe を呼び出します。

VB フォームを閉じると、システム エラー (Windows メッセージ) が表示されます: メモリの場所を読み取れませんでした。次に、Windows は、アプリケーションを閉じるかデバッグするかを尋ねてきます。テスト マシンにはデバッガーがインストールされていないため、何を選択してもかまいません。デバッグを選択すると、終了する必要があるというメッセージが表示されます。

このエラーは、次の 2 つの条件でのみ発生します (両方とも該当する必要があります)。

  • これを Windows 2000 で実行した場合。
  • また、これは、レポートを生成するために別の COM DLL (Crystal レポート) を呼び出す [レポートの表示] ボタンを最初にクリックした場合にのみ発生します。

基本的には、次のような流れです。

    C#.Net アプリケーション
     |-- MDI フォーム
          | | フォームのボタンをクリックすると、VB6 メソッドが呼び出されます。
          +-- フォームを表示します。setParent(VBForm.Handle, DotNetForm.Handle) が呼び出されます
          | | とフォームが表示されます。呼び出されたメソッドが戻ります (戻り値はありません)
          | | | |
          | | +-- [レポートの表示] をクリックすると、Crystal Reports を使用してレポートが生成され、ユーザーに表示されます。
          | | | |
          | | \-- 終了ボタンをクリックすると、フォームが閉じられます -ここでエラーが発生します
          | |
          \-- .Net フォームは、その内部フォームが閉じられた後もずっと生き続けます

このようなエラーの原因を知っている人はいますか? VB にはOn Error GotoMain メソッド全体を囲む行があり、VB のエラーをキャッチする必要がありますが、そうではありません。ただし、このエラーは VB で生成された EXE ファイルから発生します。

4

1 に答える 1

1

アンマネージ デバッガーをアタッチし、スタック トレースを確認することで、VB exe 内のどのモジュールがクラッシュしているかを確認できます。

Crystal Reports が原因の可能性が高いように思えますが、他の何かが問題を引き起こしている可能性があります。VB コードにアクセスできると仮定すると、Crystal Report のすべての COM オブジェクトが正しくリリースされていることを確認できます。何かが残っている場合、アプリケーションのシャットダウンとうまく相互作用していない可能性があります。

本当にハックなソリューションが必要な場合は、OnClose イベント内で Win32 TerminateProcess 関数を呼び出すことを検討できます。これにより、接続されている DLL に通知せずにプロセスが終了します...きれいではなく、データベースへの接続がぶら下がっている可能性があります。

于 2008-12-30T02:03:59.220 に答える