2010-11-19 18 views
1

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コードを実行すると、すべて正常に動作します。

私は管理者として実行しようとしましたが、何も変更されませんでした。

どこでこの問題のトラブルシューティングを行うことができますか?

+0

旧バージョンのWindowsとの互換性を保ちようとしましたか?実行可能ファイルを右クリックし、[互換性]タブに移動します。時々それは魔法のように働く。 – BeemerGuy

+0

@BeemerGuy、はい。私はそれに言及するのを忘れました - はい、私は互換モードを試しました - それは動作しませんでした。 – AngryHacker

+0

VBアプリケーション内からVB6コードを実行すると、エラーを再現できますか?その場合は、VBデバッガを使用してより正確に追跡することができます。 –

答えて

3

DEPをオフにします。古いAxeコントロールは、NXフラグをオフにする気にはならない、ファンキーなサブクラス化サンク(ATL/MFC以外)を使用する傾向があります。

+0

ダング、あなたはそれを呼んだ。今何?これを修正する簡単な方法はありますか?10歳のグリッドを別の10歳のグリッドに置き換えるのですか? – AngryHacker

2

特に64ビットシステムで実行する場合は、anyCPUでなくx86ターゲット用にコンパイルしていることを確認してください。 64ビットWindows 7システムで古い32ビットDLLを使用してanyCPUを使用し、古いIBMのマニュアルを引用すると「結果は予測できません」という矛盾があります。

+0

結果はかなり予測可能です。 64ビットWindowsシステムのAnyCPUは64ビットプロセスを作成し、32ビットDLLはロードされません。 32ビットDLLの時代はまったく問題ではありません。 –

+0

真ですが、エラーメッセージはかなり変化する可能性があります。 – xpda

+0

Win7はこの場合32ビットなので、問題ありません。 – AngryHacker

関連する問題