La memoria non poteva essere “letta” errore quando si apre un modulo VB6 da un'applicazione Net

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

Domanda

Ho un'applicazione scritta in C # .Net (Framework 2.0 se è importante). Chiede un exe VB6 che espone una classe COM con un metodo -. Che mostra una forma

Quando il form VB è chiusa, ottengo un errore di sistema (un messaggio di Windows): La posizione di memoria non poteva essere letta. Poi, Windows mi chiede se chiudere l'applicazione o eseguire il debug di esso. Non ha molta importanza ciò che ho scelto dal momento che non ci sono debugger installati sulla macchina di prova e quando seleziono il debug mi dà un messaggio che dovrà chiudere.

L'errore si verifica solo in due condizioni (entrambi devono applicare):

  • Quando questo viene eseguito in Windows 2000.
  • Inoltre, questo accade solo se clicco sul "Visualizza Report" pulsante prima, che chiama un'altra DLL COM - report Crystal -. Per generare un report

In sostanza, il flusso è in questo modo:

    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

Qualcuno sa che cosa potrebbe causare un errore del genere? Il VB ha una linea On Error Goto che circonda l'intero metodo principale, che dovrebbe prendere qualche errore in VB - ma non è così. L'errore, tuttavia, provengono dal file EXE VB-generated.

È stato utile?

Soluzione

Si potrebbe confermare quale modulo all'interno del exe VB si pianta collegando un debugger non gestito e vedere ciò che l'analisi dello stack è.

Crystal Reports suona come un probabile colpevole, ma è possibile che qualcos'altro sta provocando il problema. Supponendo di aver accesso al codice VB vorrei verificare che tutti gli oggetti Crystal Report COM vengono rilasciate in modo corretto. Se qualcosa è stato lasciato intorno allora potrebbe essere interagire male con chiusura dell'applicazione.

Se si desidera una soluzione davvero hacker si potrebbe prendere in considerazione chiamando la funzione Win32 TerminateProcess all'interno dell'evento OnClose. Ciò terminerà il processo senza informare alcun DLL collegate ... non abbastanza e può portare a penzoloni connessioni a database, ecc che dovranno pulire se stessi verso l'alto (probabilmente su timeout).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top