2012-07-04 2 views
0

VB6 프로젝트를 VB6 exe로 컴파일했습니다.VB6/.NET 양식 Interop

시작 개체로 간단한 폼을 가지고 있습니다.

그것은 regasm'd .NET dll을 통해 .NET 모달 형식을 시작하고 콜백 COM 인터페이스 (IHandler)의 구현을 전달합니다.

.NET에서는 VB6의 IHandler 구현을 다시 호출합니다.

VB6은 vbModal을 사용하여 새 양식을 표시하려고합니다. VB6 양식은 여전히 ​​보이는 모달 .NET 양식 때문에 상호 작용이 차단됩니다.

여기 또는 제안 된 접근 방법에는 어떤 방법이 있습니까?

새 (STA) (관리되는) 스레드에서 VB6을 다시 호출하려고 시도했지만 MyCallbackForm.Show vbModal을 시도하면 "잘못된 프로 시저 호출 또는 인수가 발생합니다."... 다음과 같이 가정합니다. 새로운 스레드에서 다시 호출한다는 사실과 함께 ...

업데이트 : VB6 프로젝트 유형을 ActiveX로 설정하면 새 스레드에서 콜백을 성공적으로 수행하고 내 VB6 양식을 모달로 표시 할 수있었습니다. exe ...하지만 일단 그렇게했다면 콜백에서 스레드를 잃는 것처럼 보였습니다. VB6에서 .NET으로 이어지는 호출은 교차 스레딩 예외가 발생했습니다. 나는 ActiveX EXE를 사용할 때 스레딩 모델과 관련이 있다고 생각합니다.

답변

0

VB6 응용 프로그램에서 .NET 컨트롤 모덜리스를 사용하여 폼을 표시 할 수 있지만이 작업을 수행해야합니다 :

  • 양식에 있어야하는 모든 콘텐츠가 포함 된 .NET 사용자 정의 컨트롤을 만듭니다.
  • 사용 MS InteropToolkit 쉽게 그 컨트롤을 COM 볼 수있는 UserControl을 생성하고,리스는 (당신은 또한 첫 번째 단계를 건너 뛰고 직접 COM-볼 수 UserControl을 만들 수 있습니다)
  • 이 VB6에서 새 양식을 작성 UserControl에서 상속 프로젝트에 추가하고 COMVisible .NET 사용자 정의 컨트롤을 추가하십시오.
+0

문제는. NET 양식을 표시하지 않습니다. 일단 모달로 표시하면 VB6 콜백이 사용자 상호 작용을 캡처 할 수 없습니다. – Jeff

0

두 개의 프로젝트로 VB6 EXE 프로젝트를 분할 할 수 있습니다.
프로젝트 하나는 현재 VB6 프로젝트에서 .Net DLL로 표시 할 수 있도록하려는 하위 폼을 뺀 것입니다. 프로젝트 2는 .Net DLL에서 표시 할 수있는 하위 폼을 포함해야하는 VB6 ActiveX DLL 프로젝트입니다.

그래서, 대신 일을 : 1 VB6.exe 프로젝트는 닷넷 DLL 통과 IHandler 2. 닷넷 프로젝트가 IHandler 3. IHandler (VB6 구현)에서 함수를 호출 호출하는 하위 폼, 행운을 표시하려고합니다.

당신은 할 수 : 1 VB6.exe 프로젝트는 닷넷 DLL 하위 폼 (들) 2. 닷넷 프로젝트는 하위 폼을 포함하는 액티브 X DLL에서 "ShowYourSelf"함수를 호출 주요 프로젝트 (들에서 필요한 어떤 데이터를 전달 호출) 그리고 필요한 모든 데이터를 전달합니다.

+0

ActiveX 구성 요소를 등록하지 않고이 작업을 수행 할 수있는 방법이 있습니까? – Jeff

+0

reg 무료 ActiveX라고하는 것이 있지만 직접 사용하지 않았으므로 어떻게 작동하는지 말할 수는 없습니다. – GTG