La mémoire ne peut être « lu » erreur lors de l'ouverture une forme VB6 à partir d'une application .NET

StackOverflow https://stackoverflow.com/questions/399295

Question

J'ai une demande écrite en C # .Net (Framework 2.0 si elle compte). Il appelle un exe VB6 qui expose une classe COM avec une méthode -. Qui montre une forme

Lorsque le formulaire VB est fermé, je reçois une erreur système (message Windows): L'emplacement de mémoire ne peut pas être lu. Ensuite, Windows me demande si pour fermer l'application ou le déboguer. Il ne compte pas vraiment ce que je choisis car il n'y a pas débogueurs installés sur la machine de test et lorsque je sélectionne debug il me donne un message qu'il devra fermer.

L'erreur ne se produit que dans deux conditions (les deux doivent appliquer):

  • Lorsque cela est exécuté sous Windows 2000.
  • En outre, cela ne se produit que si je clique sur le bouton « Afficher le rapport » d'abord, qui appelle une autre DLL COM - Crystal Reports -. Générer un rapport

En fait, le flux est comme ceci:

    C#.Net application
     |-- MDI Form
          |   When clicking a button on the form, the VB6 method is called
          +-- showing the form. setParent(VBForm.Handle, DotNetForm.Handle) is called
          |   and the form is shown. The called method returns (there is no return value)
          |    |
          |    +-- When clicking "Display report", crystal reports is used to generate a report and show it to the user
          |    |
          |    \-- When Exit button is clicked, form is closed - this is where the error occures
          |
          \-- .Net form keeps on living long after that inner form is closed

Quelqu'un sait-il ce qui pourrait causer une telle erreur? Le VB a une ligne de On Error Goto entourant l'ensemble de la méthode principale, qui devrait capturer toute erreur dans VB - mais il ne fonctionne pas. L'erreur ne, cependant, vient du fichier EXE généré VB.

Était-ce utile?

La solution

Vous pouvez confirmer quel module dans le VB exe est bloque en attachant un débogueur non géré et de voir ce que la trace de la pile est.

Crystal Reports ressemble à un coupable probable, mais il est possible que quelque chose d'autre déclenche le problème. En supposant que vous avez accès au code VB je vérifier que tous les objets COM Crystal Report sont libérés correctement. Si quelque chose est laissé autour alors il pourrait être mal interagir avec l'arrêt de l'application.

Si vous voulez une solution vraiment hackish vous pourriez envisager d'appeler la fonction TerminateProcess Win32 dans l'événement OnClose. Cela mettra fin au processus sans en informer toutes les DLL joint ... pas joli et peut conduire à des connexions ballants aux bases de données, etc qui devront se nettoyer (probablement sur le délai d'attente).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top