2017-12-14 20 views
0

곧 삭제 될 수도있는 간단한 질문이지만 다른 곳에서는 찾을 수없는 문제가 있습니다 (적어도 Google은 도움이되지 않음).MFC 창의 Winapi 하위

MFC를 기반으로하는 소프트웨어 용 플러그인을 작성하려고하지만 MFC를 직접 사용하지 않습니다. 결국, 나는 적절한 핸들과 모듈을 사용하여 winapi로 윈도우를 생성하여 MFC와 작업 할 수 있다고 생각했지만 그렇게 쉽게 보일 수는 없다. "모달"창을 시작하려고합니다 (즉, EnableWindow(parentHwnd, FALSE)을 호출하여 부모를 차단합니다). 사용자가 내가 부모를 활성화하고 단지 내 사용자 지정 창을 닫으려면 창을 닫을 때

LRESULT CALLBACK wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam){ 
    //Do stuff to get a HWND to the parent window 
    switch(msg) { 
     case WM_CLOSE: 
      EnableWindow(parentHwnd, TRUE); 
      //DestroyWindow(hwnd); 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
     case WM_DESTROY: 
      EnableWindow(parentHwnd, TRUE); 
      //PostQuitMessage(0); 
      return DefWindowProc(hwnd, msg, wParam, lParam); 
    //... Handling other messages 

:이 창을 위해 나는 정의의 WndProc 함수를 썼다. DestroyWindow(hwnd)PostQuitMessage(0) 함수에 주석이 달려 있으며, 대신 DefWindowProc을 반환합니다. 이다의 주석 처리를 제거 메시지, 다음을 제외하고 모든 응용 프로그램이 충돌 떠나는 이유는

enter image description here

내 첫번째 추측은 윈도우의 메시지에 문제가 있음을 것입니다. 내가 "DECLARE_MESSAGE_MAP"매크로 또는 무언가를 MFC의 wndProc 내 이벤트를 처리하도록 사용해야하는지 모르겠습니다. 나는 창문 개발의 초심자이기 때문에이 충돌에 대한 해결책을 찾았음에도 불구하고 왜 처음에는 실패했는지 모르겠다. 고맙습니다!

+0

'PostQuitMessage()'당신이 응용 프로그램을 종료 할 _actually_하지 않는. 그냥 코멘트를 써서 해봤습니까? 'DestroyWindow()'를 유효하게 둡니다. –

+1

MFC 응용 프로그램에 일반적인 C 또는 C++ 구현 창을 포함시키는 데 문제가 없어야합니다. 표준 버튼 등이 작동하고 그들은 plain-ol 'C로 작성되었습니다. –

+1

정보가 없어도 문제가 무엇인지 알기가 어렵습니다. 플러그인은 어떻게로드됩니까? 소유자 윈도우와 다른 스레드에서 실행됩니까? 예외가 발생했을 때 디버거를 중단 할 수있는 옵션을 설정 했습니까 (오류 메시지의 코드를보고 어떤 유형의 예외가 수신되는지 확인하십시오). 당신이 그것을 한 후에, 부적당 한 논쟁은 무엇입니까? 여하튼, Windows API 윈도우와 MFC를 혼합하는 것은 문제가되지 않습니다. MFC는 Windows API를 둘러싼 C++ (- ish) 래퍼입니다. – IInspectable

답변

0

먼저 "플러그인"이란 정확히 무엇입니까? 내가 추측 할 수있는 바는 메인 실행 파일에 내장 된 추가 코드 일 것입니다 (그렇지 않으면 메시지 맵과 "MFC의 wndProc"에 대해 묻지 않을 것입니다). 귀하의 질문에 관해서는, 아마 당신은 이것에 들어갈 필요가 없을 것입니다. 그냥 호출하는 일을한다면 난 그냥 궁금 해서요 : 당신은 호출해서는 안

DialogBox(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDD_MYDIALOG), parentHwnd, MyDlgProc);

+0

파일이 사용자 지정 파일 확장명을 가지고 있더라도 DllMain을 호출하기 때문에 dll이어야합니다. 처음에는 리소스를로드하는 데 적절한 모듈을 얻는 데 문제가 있었지만'afx' 메서드로 약간의 작업을 한 후에 작동 시켰습니다. 메시지가 올바른 WndProc 콜백 함수에 도착하지 않는 것처럼 느껴집니다. – Malanche

+0

글쎄, 플러그인에서 'parentHwnd'를 사용할 수 있다면 (그것이 무엇이든간에) 먼저 모달 대화 상자를 테스트로 생성하는 것이 어렵지 않을 것입니다. 'parentHwnd'를 소유하고있는 같은 thread로 작성해주세요. 리소스는 단순히 포함 된 모듈에서로드됩니다. 그리고 DllMain은 앱에 의해 호출되는 것이 아니라 시스템에 의해 간접적으로로드/언로드/스레드 연결/분리 이벤트에서 호출됩니다. 하지만 플러그인이 실제로 무엇인지 모르는 것이 다른 회원이 도움을 제공하는 데 도움이되지 않습니다. 알기 쉽습니다. 작성한 프로젝트 유형을 확인하십시오. 그리고 MFC 구현 모듈과 동일한 모듈입니까? –