2012-05-04 3 views
1

이상한 문제가 발견되었습니다. 내 MFC 응용 프로그램에서 CEnd 1 CWnd 포인터를 캐스팅하는 중이 야. GetFocus 함수를 통해 CWnd 포인터를 검색합니다. dynamic_cast<CEdit*>(pWnd) 일 때 0을 반환합니다. 무엇이 될 수 있습니까?CWnd MFC의 CEdit 포인터에 대한 포인터를 캐스팅

+0

'CWnd' 포인터가 실제로'CEdit' 컨트롤에 대한 포인터인지 확신합니까? –

+0

Yeap. CEdit 컨트롤을 가리키고 있는지 확인했습니다. GetDlgCtrlID를 호출하면 컨트롤의 ID를 반환합니다. – besworland

+0

RTTI가 활성화되어 있습니까? C++ 컴파일러 설정에서 이것을 확인할 수 있습니다. – msteiger

답변

5

첫째, MFC 라이브러리는 RTTI를 사용하여 컴파일되지 않으므로 dynamic_cast은 어쨌든 작동하지 않습니다.

둘째 CWnd::FromHandle 의해 반환 CWnd* 어느 현존 CWnd, 또는 하나도 HWND 주위 플라이급 래퍼가 존재하지 않는 경우. 플라이 웨이 래퍼가 반환되는 경우 기본 HWND이 편집 컨트롤을 참조하는 경우에도 CEdit이되지 않습니다.

HWND을 보유하기 위해 CEdit을 이미 생성 한 경우에만 CEdit이 표시됩니다. 당신은 당신이 얻을 CWnd*은 이미 기존 개체에 대한 것을 알고 싶은 경우에

, 당신은 다음, 명시 적으로 하나를 만들 HWND에 첨부 Attach를 호출 할 필요가 CEdit*를 얻으려면 CWnd::FromHandlePermanent

를 사용합니다.

는 속임수하려는 경우 또는 CEdit는 데이터 구성원이나 가상 함수가 없습니다 그것은 동일한 메모리 레이아웃을 가지고 있기 때문에 그래서 당신은, A (이론적으로 안전하지 않은) static_cast를 사용할 수 CWnd에서 직접 상속합니다.

+0

사실 static_cast는 정상적으로 작동합니다. 유일한 포인트는 어떤 종류의 요소에 초점이 맞는지 확인해야한다는 것입니다. 그러므로 나는 당신을 dynamic_cast 할 수 있다고 생각했습니다. – besworland

+4

아니요, 당신은'GetClassName (HWND)'을 할 필요가 있습니다. – Ben

+0

GetClassName은 좋은 방법입니다! 고맙습니다! – besworland

관련 문제