A memória não pôde ser “lida” erro ao abrir um formulário de VB6 de um aplicativo .NET

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

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.

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top