VB6 ActiveX DLLのメソッドを呼び出してダイアログボックスを表示する.NET 3.5 winformsアプリケーションがあります。すべてのことがほぼ10年間正常に機能しました(最初は.NET 1.1アプリ、その後は2.0、次に3.5、すべてWindows XP)。.NET/VB6アプリケーションがWindows 7で失敗する
.NETコード
try {
VB6Object obj = new VB6Object();
obj.DoStuff();
}
catch (Exception ex) { // handle }
VB6ObjectクラスのVB6コード:今、顧客は、Windows 7にアップグレードしたことを、私は、コールの構造はこのようなものですSystem.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
を経験しています
Public Sub DoStuff()
on error goto errHandle
RetrieveData();
Call frmPopup.Show(vbModal)
exitPoint:
exit sub
errHandle:
' handle error
End Sub
問題はVB6コードから始まりますこの行の:Call frmPopup.Show(vbModal)
。エラーは.NETコードに伝播されます(VB6コードのエラーハンドラは完全に無視されます)。ここでエラーを処理します。私は問題がfrmPopupのLoadイベントであるかもしれないと思ったが、コードはLoadイベントに到達しなかった(私はどこでもステートメントをトレースしているので、それは私が知っている)。
興味深いのは、2度目の呼び出しでは、全く失敗しないが、フォームにサードパーティのグリッド(ActiveX DevExpress Quantum Grid)がないため、グリッドがおそらくWindows 7と何らかの形で互換性があります。
VB6 ActiveX DLLは単にEXEとして、またはVS2008 IDEからアプリケーションを実行すると、私が説明したことがすべて発生します。 COM間接参照を使用し、IDEでVB6コードを実行すると、すべて正常に動作します。
私は管理者として実行しようとしましたが、何も変更されませんでした。
どこでこの問題のトラブルシューティングを行うことができますか?
旧バージョンのWindowsとの互換性を保ちようとしましたか?実行可能ファイルを右クリックし、[互換性]タブに移動します。時々それは魔法のように働く。 – BeemerGuy
@BeemerGuy、はい。私はそれに言及するのを忘れました - はい、私は互換モードを試しました - それは動作しませんでした。 – AngryHacker
VBアプリケーション内からVB6コードを実行すると、エラーを再現できますか?その場合は、VBデバッガを使用してより正確に追跡することができます。 –