2012-03-14 2 views
5

MSDN은 CDialog.DoModal() 함수에 대해 함수가 대화 상자를 만들 수없는 경우 반환 값이 -1이라고 말했습니다. 어떤 경우에는 대화 상자를 만들지 못할 수도 있습니다.CDialog.DoModal() 함수가 대화 상자를 만드는 데 실패 할 때?

MFC 소스 코드를 빠르게 조사하면 (LPCDLGTEMPLATE) LockResource (hDialogTemplate)가 NULL을 반환하는지 DoModal 함수가 -1을 반환 할 수 있는지를 보여줍니다.

내 문제는 스트레스 테스트에서 안정적으로 재생산 할 수 없기 때문에 프로그램을 디버그하여 근본 원인을 찾을 수 없습니다. 여기 누가 비슷한 문제를 만났습니까?

+3

MFC를 사용 하시겠습니까? – ApprenticeHacker

+1

GetLastError는 뭐라고 말합니까? –

+0

@IntermediateHacker, "API가 싫어서, 왜 사용하는지"논쟁으로 바꾸지 말고, 우리는 하루 종일 여기에있을 것입니다. –

답변

4

DoModal()CreateDialogIndirect() API 함수를 사용합니다. 함수는 다음과 같은 상황에서 실패 할 수 사촌 DialogBox() 상태의 문서 다음 WH_CBT 후크가 설치된

  • 시스템 클래스가 다른 모듈에 의해 등록 된

    • 무효 파라미터 값, 오류 코드를 반환합니다.
    • 대화 상자 템플릿의 컨트롤 중 하나가 등록되지 않았거나 해당 창 프로 시저가 WM_CREATE 또는 WM_NCCREATE에서 실패합니다.

  • 는 개인적으로 처음 세 가지 이유를 발견하지,하지만 내 대화 상자가 컴퓨터에 등록되지 않은 ActiveX 컨트롤을 포함하기 때문에 나는 네 번째로 한 번 물린했다. 어쩌면 당신도 같은 문제를 겪고있을 것입니다.

    +0

    MFC는 'DialogBox'를 사용하지 않고 다른 호출과 함께 시뮬레이션합니다. 이 대답의 정보 중 일부는 여전히 유용합니다. –

    +0

    @Mark, 당신은 절대적으로 옳습니다. 모달 대화 상자에 대해서도'CreateDialogIndirect()'를 사용하고, 모달 상태 자체를 구현합니다. 이유가 궁금하지만, 아마도 좋은 이유가있을 것입니다. 설명 주셔서 감사합니다 :) –

    +1

    로캘을 변경 한 후 DoModal 호출이 실패했습니다. 새 리소스가 원래 리소스의 일부 ID를 잃어 버렸습니다. 나는 비슷한 문제로 다른 사람들에게 힌트를주기를 희망하면서 이것을보고한다. – Zac

    0

    근본 원인은 소모 된 GDI 개체에서 비롯된 것으로 나타났습니다. 우리의 소프트웨어는 누출을 처리합니다. GDI 개체의 최대 수는 레지스트리에서 설정할 수 있습니다. 값은 Windows XP에서 16000입니다. 나는 많은 UI 컨트롤을 만들도록 프로그램을 만들었지. 이렇게하면 GDI 처리 상황을 시뮬레이션 할 수 있습니다. 결과적으로 같은 문제가 다시 발생합니다. \

    HKEY_LOCAL_MACHINE \ 소프트웨어 마이크로 소프트 \ 윈도우 NT를 \ CurrentVersion \ WINDOWS \ GDIProcessHandleQuota

    참조 : 그래서 최종 결론 http://msdn.microsoft.com/en-us/library/windows/desktop/ms724291%28v=vs.85%29.aspx

    이라는 GDI 개체가 소진 될 때, 같은를 CDialog와 같은 일부 UI 컨트롤, 만들지 못했을까요?

    +0

    복잡한 처리 GUI (CAD, EDA)로 응용 프로그램을 실행/디버깅 할 때 배기량 처리는 Win32에서 잘 알려진 문제입니다. Win64에서 Out of Handles 문제는 기대하지 않았습니다. – BlackBada

    관련 문제