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?
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
@BeemerGuy, Oui. J'ai oublié de mentionner cela - oui, j'ai essayé le mode de compatibilité - cela n'a pas fonctionné. – AngryHacker
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. –