Ошибка памяти не может быть прочитана при открытии формы VB6 из приложения - PullRequest
0 голосов
/ 30 декабря 2008

У меня есть приложение, написанное на C # .Net (Framework 2.0, если это имеет значение). Он вызывает exe-файл VB6, который предоставляет COM-класс с одним методом - который показывает форму.

Когда форма VB закрыта, я получаю системную ошибку (сообщение Windows): не удалось прочитать местоположение в памяти. Затем Windows спрашивает, нужно ли закрыть приложение или отладить его. Неважно, что я выберу, так как на тестовом компьютере не установлены отладчики, и когда я выбираю отладку, выдается сообщение о том, что его придется закрыть.

Ошибка возникает только при двух условиях (должны применяться оба):

  • Когда это выполняется под Windows 2000.
  • Кроме того, это происходит только в том случае, если я сначала нажму кнопку «Показать отчет», которая вызывает другую COM DLL - Crystal Reports - для создания отчета.

По сути, поток выглядит так:

    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 - <b>this is where the error occures</b>
          |
          \-- .Net form keeps on living long after that inner form is closed

Кто-нибудь знает, что может вызвать такую ​​ошибку? В VB есть строка On Error Goto, окружающая весь метод Main, который должен отлавливать любые ошибки в VB, но это не так. Ошибка, однако, исходит из сгенерированного VB EXE-файла.

1 Ответ

1 голос
/ 30 декабря 2008

Вы можете проверить, какой модуль в exe-файле VB дает сбой, подключив неуправляемый отладчик и посмотрев, что такое трассировка стека.

Crystal Reports звучит как вероятный преступник, но возможно, что что-то еще вызывает проблему. Предполагая, что у вас есть доступ к коду VB, я бы проверил, что все COM-объекты Crystal Report освобождаются правильно. Если что-то осталось, это может плохо взаимодействовать с завершением работы приложения.

Если вы хотите действительно хакерское решение, вы можете рассмотреть возможность вызова функции Win32 TerminateProcess в событии OnClose. Это завершит процесс, не сообщая ни о каких подключенных DLL-библиотеках ... не очень красиво и может привести к оборванным соединениям с базами данных и т. Д., Которые должны будут очиститься (вероятно, по таймауту).

...