2012-12-31 1 views
1

MFC DLL을 통해 확장 기능을 제공하는 VB6 응용 프로그램이 있습니다. 그러나 DLL의 CDialog 기반 클래스에는 특정 문제가 있습니다. 우리는 DoModal()이 그 부모가 무엇인지를 알 수 있도록 VB23 응용 프로그램의 주 양식에서 Me.hWnd을 CDialog 생성자에 전달합니다. CDialog 기반 클래스는 DoModal()의 VB6 응용 프로그램 위에 머물러 있지만 블록 VB6 응용 프로그램은 모달 대화 상자에서 예상되는 방식이 아닙니다. 즉, DLL 대화 상자가 EXE 창 앞에 남아있는 동안 DLL을 호출 한 단추를 계속 클릭하여 대화 상자를 다시 표시 할 수 있습니다.MFC DLL이있는 VB6 호스트 잘못 모달 대화 상자 표시

VB6 코드에서 보여줄 내용이 많지 않습니다. 내가 언급했듯이 그것은 단지 Me.hWnd에 전달됩니다. MFC 코드는 충분히 간단합니다.

HWND exeHwnd = pSessionContext->GetHWnd(); // our state container for the DLL 
CWnd* exeWnd = CWnd::FromHandle(exeHwnd); 
MyCDialog dlg(exeWnd); 
INT_PTR result = dlg.DoModal(); 
// waits, stays in front, but does not "block" the window 
switch (result) // ... 

길을 따라 값을 추적하고 Spy ++로 확인 된 창 핸들을 추적했습니다. 모든 것이 괜찮은 것 같습니다. 내가 누락하거나 잘못하고있는 아이디어가 있습니까? HWND 값이 메시지 박스에 대한 다른 곳에서 사용하고 예상대로 작동합니다

그건

추가 정보.

+0

'pSessionContext-> GetHWnd'는 VB6의'Me.hWnd'를 반환합니까? – wqw

+0

이 맞습니다. –

답변

1

간단한 해결책은 DLL을 호출하기 직전에 VB6 코드에서 상위 VB6 응용 프로그램을 사용하지 않도록 설정하고 DLL 코드가 VB6 응용 프로그램을 다시 사용할 수있게하는 경우 일 수 있습니다. 이 같은 (공중 코드)

Me.Enabled = False 
MagicDLL.ShowTheDialog(Me.hWnd) 
Me.Enabled = True 
+0

포커스 손실로 인해 창 강조 표시가 여전히 변경 되더라도이 기술은 주요 문제를 해결합니다. 좋은 해결 방법. –

+0

누군가가 더 나은 해결책을 제안 할 수 있기를 바랍니다. :) – MarkJ

+1

그것은 hack-tastic에 불과하지만 다른 해결책은 DLL에 모조 (dummy) 부모 CDialog를 만드는 것입니다. 그런 다음 실제 CDialog를 모달로 시작합니다. –