2010-11-19 7 views
1

J'ai une application .NET 3.5 winforms qui appelle une méthode dans une DLL ActiveX VB6, ce qui ouvre une boîte de dialogue. Tout a bien fonctionné pendant près de 10 ans (d'abord en tant qu'application .NET 1.1, puis en version 2.0, puis en version 3.5, toutes sous Windows XP). Maintenant que le client a mis à niveau vers Windows 7, je suis confronté à un System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.L'application .NET/VB6 échoue sous Windows 7

La structure de l'appel est comme ceci:

Code .NET

try { 
    VB6Object obj = new VB6Object(); 
    obj.DoStuff(); 
} 
catch (Exception ex) { // handle } 

code VB6 en classe VB6Object

Public Sub DoStuff() 
    on error goto errHandle 
    RetrieveData(); 

    Call frmPopup.Show(vbModal) 

exitPoint: 
    exit sub 
errHandle: 
    ' handle error 
End Sub 

le problème commence dans le code VB6 sur cette ligne: Call frmPopup.Show(vbModal). L'erreur est propagée au code .NET (les gestionnaires d'erreurs dans le code VB6 sont complètement ignorés) où je gère l'erreur. Je pensais que le problème pourrait être l'événement Load de frmPopup, mais le code n'atteint jamais l'événement Load (j'ai des instructions de traçage partout, donc c'est comme ça que je sais). La partie intéressante est que la deuxième fois que je fais l'appel, il ne manque pas du tout, mais il manque une grille tierce (ActiveX DevExpress Quantum Grid), donc je suppose que la grille n'est probablement pas compatible avec Windows 7.

Tout ce que j'ai décrit se produit lorsque je lance simplement l'application en tant qu'EXE ou VS2008 IDE, donc la DLL VB6 ActiveX est simplement une référence. Si j'utilise l'indirection COM et exécute le code VB6 dans l'IDE, tout fonctionne parfaitement bien.

J'ai essayé d'exécuter des choses en tant qu'administrateur, mais rien n'a changé. Où puis-je aller à côté de résoudre ce problème?

+0

Avez-vous essayé de fonctionner en compatibilité avec une ancienne version de Windows? Cliquez avec le bouton droit sur l'exécutable et accédez à l'onglet Compatibilité. parfois cela fonctionne comme de la magie. – BeemerGuy

+0

@BeemerGuy, Oui. J'ai oublié de mentionner cela - oui, j'ai essayé le mode de compatibilité - cela n'a pas fonctionné. – AngryHacker

+0

Pouvez-vous reproduire l'échec si vous exécutez le code VB6 à partir d'une application VB? Si c'est le cas, vous pouvez utiliser le débogueur VB pour le retrouver plus précisément. –

Répondre

3

Désactiver DEP. Les anciennes commandes Axe ont tendance à utiliser des thunk sous-classes funky (autres que ATL/MFC) que personne ne se soucie de désactiver le drapeau NX.

+0

Dang, tu l'as appelé. Et maintenant? Y a-t-il un moyen facile de résoudre ce problème ou est-ce que je remplace une grille vieille de 10 ans par une autre grille vieille de 10 ans? – AngryHacker

2

Assurez-vous que vous compilez pour la cible x86 au lieu de tout UCP, en particulier si vous exécutez sur des systèmes 64 bits. Il existe un certain type de conflit lorsque vous utilisez anyCPU avec une ancienne DLL 32 bits sur un système Windows 7 64 bits, et, pour citer les anciens manuels IBM, "les résultats sont imprévisibles".

+0

Les résultats sont assez prévisibles. 'AnyCPU' sur un système Windows 64 bits crée un processus 64 bits et la DLL 32 bits ne sera pas chargée. L'âge de la DLL 32 bits ne compte pas du tout. –

+0

True, mais le message d'erreur peut être assez variable. – xpda

+0

Win7 est 32 bits dans ce cas, ce n'est pas le problème. – AngryHacker