A memória não pôde ser “lida” erro ao abrir um formulário de VB6 de um aplicativo .NET
-
29-08-2019 - |
Pergunta
Eu tenho um aplicativo escrito em C # .Net (Framework 2.0 se importa). Ele chama um exe VB6 que expõe uma classe COM com um método -. Que mostra um formulário
Quando o formulário VB é fechado, recebo um erro de sistema (mensagem Windows): O local de memória não pôde ser lida. Em seguida, Windows me pergunta se para fechar a aplicação ou depurá-lo. Realmente não importa o que eu escolher uma vez que não são depuradores instalado na máquina de teste e quando eu seleciono depuração dá-me uma mensagem que terá de perto.
O erro só acontece sob duas condições (ambos devem ser aplicadas):
- Quando este é executado no Windows 2000.
- Além disso, isso só acontece se eu clicar no botão "Exibir relatório" primeiro, que chama outro COM DLL - relatórios de cristal -. Para gerar um relatório
Basicamente, o fluxo é assim:
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
Alguém sabe o que poderia causar esse erro? A VB tem uma linha On Error Goto
torno todo o método principal, que deve pegar qualquer erro no VB - mas isso não acontece. O erro, no entanto, vir a partir do arquivo EXE gerado-VB.
Solução
Você poderia confirmar qual módulo dentro do exe VB está falhando, anexando um depurador não gerenciado e ver o que o rastreamento de pilha é.
Crystal Reports soa como um provável culpado, mas é possível que alguma coisa está provocando o problema. Supondo que você tenha acesso ao código VB gostaria de verificar que todos os objetos Crystal Report COM estão sendo liberados corretamente. Se algo está a ser deixado ao redor, então ele poderia estar interagindo mal com desligamento do aplicativo.
Se você quer uma solução realmente hackish você poderia considerar chamar a função Win32 TerminateProcess dentro do evento OnClose. Isto irá encerrar o processo sem informar nenhum DLLs ligados ... não é bonito e pode levar a pendendo ligações a bases de dados, etc que precisam limpar-se para cima (provavelmente no tempo limite).