2014-12-23 6 views
1

버튼 컨트롤이있는 MFC 응용 프로그램이 있다고 가정 해 보겠습니다. OON_BN_CLICKED가 매핑하는 함수를 검색하는 방법이 있습니까? CWnd는 컨트롤에 대한 포인터를 반환하는 GetDlgItem 함수를 가지고 있습니다. 이 포인터가 있으면 컨트롤이 매핑 된 함수를 가져 오는 방법이 있습니까?MFC 응용 프로그램에서 컨트롤이 매핑되는 처리기 함수를 가져 오는 방법이 있습니까?

나는 대화 항목이나 컨트롤에 메시지를 보내는 데 사용할 수있는 방법을 발견했습니다. CWnd :: SendDlgItemMessage (http://msdn.microsoft.com/en-us/library/e2a6czt1.aspx),하지만 가능한 메시지를 알 수 있기를 바랍니다.

+0

해당 컨트롤이있는 응용 프로그램의 소스가 있습니까? 아니면 외부 컨트롤을 조사하고 싶습니까? – mwigdahl

답변

1

대부분의 경우, 사용자는 창에 보낼 수있는 메시지를 알고 있습니다. 나는 당신이 당신의 임무에 맞는 길을 택하지 않을 수도 있다고 강력하게 생각합니다. 실제로 성취하려는 것은 무엇입니까? 나는. 당신이 묻는 것은 흔하지 않으며 실제 작업은 다른 방법으로 해결할 수 있습니다.

어쨌든. 일부 MFC CWnd 파생 개체에 대한 포인터가있는 경우 해당 클래스에서 정의 된 MFC 메시지 처리기를 '리버스 엔지니어링'할 수 있습니다 해당 CWnd *. MFC는, BEGIM_MESSAGE_MAP/END_MESSAGE_MAP를 사용해, MAP 내의 모든 메세지 핸들러를 정의합니다. 이 매크로는 실제로 GetMessageMap()이라는 가상 함수와 메시지 매핑을 설명하는 구조체가 포함 된 데이터 배열을 정의합니다. 따라서 wnd-> GetMessageMap()을 사용하고 매핑 된 메시지 핸들러를 반복 할 수 있습니다. 각 항목에는 메시지 핸들러 및 매핑 된 함수에 대한 정보가 들어 있습니다. GetMessageMap은 보호 된 함수이므로 외부에서 액세스하려면 래퍼가 필요합니다. 이 같은 것 :

struct Accessor : public CWnd 
{ 
    // overwrite protected 
    virtual const AFX_MSGMAP* GetMessageMap() const { return CWnd::GetMessageMap(); } 
}; 

Accessor* msg_map_access = (Accessor*) window; 
const AFX_MSGMAP* msg_map = msg_map_access->GetMessageMap(); 

const AFX_MSGMAP_ENTRY* entry = msg_map->lpEntries; 
while (entry->nSig != AfxSig_end) 
{ 
    /// do something with the entries 
} 

다시 말하지만 이것은 일반적인 방법이 아닙니다. 일반적으로, 당신은 그렇게하지 않습니다. 그래서 당신이 왜 이것을 필요로하는지 동기 부여를 듣는 것이 좋을 것입니다.

+0

이것은 정확히 내가하려는 일입니다. 그 뒤에있는 동기는 사용자가 이런 종류의 작업을 수행 할 수있게 해주는 응용 프로그램이 있다는 것입니다. 버튼을 사용할 수 없더라도 사용자가 가질 수없는 것에 대한 액세스 권한을 사용자에게 줄 수 있습니다. 테스트를 위해 사용할 수있는 앱을 쓰고 있습니다. 변경 사항을 적용하여 앱을 보호합니다. – Amre

+0

흠 당신이 수정 (또는 외부 접근)으로부터 당신의 코드를 보호하고 싶다면 아마도 소프트웨어 보호자를 사용하는 것이 더 합리적 일 것입니다. Themida/WinLicense, Obsidium과 같은 프로그램을 보호하기위한 몇 가지 도구가 있습니다. 메시지를 보내어 다른 사람이 사용할 수없는 버튼을 클릭하지 못하도록하려면 메시지 처리기에서 작업을 허용하지 않는지 확인해야합니다 (버튼을 비활성화하는 것 이외에) – Nikolay