.NET 애플리케이션에서 VB6 양식을 열 때 메모리는 "읽기"오류가 될 수 없습니다.

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

문제

C#.NET (프레임 워크 2.0이 중요한 경우)로 작성된 응용 프로그램이 있습니다. 양식을 표시하는 하나의 방법으로 COM 클래스를 노출시키는 VB6 EXE를 호출합니다.

VB 양식이 닫히면 시스템 오류가 발생합니다 (Windows 메시지) : 메모리 위치를 읽을 수 없습니다. 그런 다음 Windows는 응용 프로그램을 닫거나 디버깅 할 것인지 묻습니다. 테스트 머신에 디버거가 설치되지 않았으므로 디버그를 선택할 때 닫아야한다는 메시지가 제공되므로 선택한 내용은 중요하지 않습니다.

오류는 두 가지 조건에서만 발생합니다 (둘 다 적용해야 함) :

  • 이것이 Windows 2000에서 실행될 때.
  • 또한 이는 다른 COM DLL -Crystal Reports를 호출하여 보고서를 생성하는 "Display Report"버튼을 먼저 클릭 한 경우에만 발생합니다.

기본적으로 흐름은 다음과 같습니다.

    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 - 오류가 발생하는 곳입니다
          |
          \-- .Net form keeps on living long after that inner form is closed

그러한 오류의 원인이 무엇인지 아는 사람이 있습니까? VB에는 an이 있습니다 On Error Goto 전체 기본 방법을 둘러싼 줄은 VB에서 오류가 발생하지만 그렇지 않습니다. 그러나 오류는 VB 생성 EXE 파일에서 나옵니다.

도움이 되었습니까?

해결책

관리되지 않은 디버거를 부착하고 스택 추적이 무엇인지 확인하여 VB EXE 내의 어떤 모듈이 충돌하는지 확인할 수 있습니다.

Crystal 보고서는 가능성이 높은 범인처럼 들리지만 다른 문제가 문제를 일으킬 수 있습니다. VB 코드에 액세스 할 수 있다고 가정하면 모든 Crystal Report COM 객체가 올바르게 출시되고 있는지 확인합니다. 무언가가 남아 있으면 응용 프로그램 종료와 심하게 상호 작용할 수 있습니다.

정말 해킹 된 솔루션을 원한다면 OnClose 이벤트 내에서 Win32 TerminateProcess 기능을 호출하는 것을 고려할 수 있습니다. 이렇게하면 첨부 된 DLL을 알리지 않고 프로세스가 끝나게됩니다. 예쁘지 않으며 데이터베이스 등을 정리 해야하는 (타임 아웃에있을 가능성이 높음) 데이터베이스 등에 연결될 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top