2011-09-06 2 views
7

WinApi를 사용하여이 win32 프로그램을 작성하려고하는데 다음과 같은 튜토리얼에 문제가있는 것 같습니다.C2440 C++ WinApi에서 LRESULT를 WNDPROC로 변환 할 수 없습니다.

MainWindow.h :

class MainWindow 
{ 
    public: 
    MainWindow(HINSTANCE); 
    ~MainWindow(void); 

    LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

    // [...] 

MainWindow.cpp :

MainWindow::MainWindow(HINSTANCE hInstance) : hwnd(0) 
{ 
    WNDCLASSEX WndClsEx; 
    // [...] 
    WndClsEx.lpfnWndProc = &MainWindow::WndProcedure; 
    // [...] 
} 

LRESULT CALLBACK MainWindow::WndProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) 
{ 
    // [...] 
} 
튜토리얼 말한다 정확하게 내가 서명을 다음 해요 때문에 나는 그러나, MainWindow를 :: WndProcedure 잘못 참조해야

생성자의 lpfnWndProc 줄에 컴파일 타임 오류가 발생합니다.

오류 C2440 : '=': 'LRESULT (__stdcall MainWindow :: *) (HWND, UINT, WPARAM, LPARAM) '에서'WNDPROC '

+0

오류가 표시되는 라인은 무엇입니까? 나는 그것이 당신이 올린 것에 있다고 생각하지 않습니다. – Mat

+4

클래스 메서드에 전달 된 창 메시지를 가져 오는 관용적 인 방법은 Raymond Chens [scratch program] (http://blogs.msdn.com/b/oldnewthing/archive/2005/04/22/410773.aspx)를 참조하십시오 (To 메서드 선언에'static'을 추가 한 후 다음 논리적 인 질문에 답하십시오). – user786653

답변

12

이 포인터가 더 이상 매개 변수와 두의 서명하지

static LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

은이 포인터가 함수 호출에서 숨겨진 매개 변수에 의해 그것을 선언하여

LRESULT CALLBACK WndProcedure(HWND, UINT, WPARAM, LPARAM); 

정적 교체 기능이 일치합니다.

3

비 정적 멤버 함수를 창 프로 시저로 사용할 수 없습니다. WndProcedurestatic으로 선언하면 컴파일해야합니다. 비 멤버 함수도 작동합니다.

비 정적 멤버 함수는 정적 멤버와 다른 서명을가집니다. 이는 명시 적으로 정의 된 매개 변수 외에도 암시적인 this 매개 변수를 받기 때문입니다.

3

WndProcedure 함수는 전역 함수이거나 정적 멤버 함수이어야하기 때문입니다.

관련 문제