만약 Visual C++ 6.0에서 작성된 MFC 어플 소스코드를 가지고 작업하다 컴파일이 안될 경우가 있습니다.

아래와 같은 예가 나오면


playmmsound.cpp(53) : error C2440: 'static_cast' : 'LRESULT (__thiscall CPlayMMSound::* )(WPARAM,LPARAM)'에서 'void (__thiscall CWinThread::* )(WPARAM,LPARAM)'(으)로 변환할 수 없습니다. 대상 형식과 일치하는 범위에 이름이 같은 함수가 없습니다.


함수의 선언과 구현부의 LRESULT를 void로 바꿔야 제대로 돌아갑니다.



// for Thread messages

#define ON_THREAD_MESSAGE(message, memberFxn) \

    { message, 0, 0, 0, AfxSig_vwl, \

        (AFX_PMSG)(AFX_PMSGT) \

        (static_cast< void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM) > \

        (memberFxn)) },


위가 ON_THREAD_MESSAGE의 매크로의 정의입니다. 위에서 보면 void 함수를 받도록 되어 있습니다.

그러나 LRESULT 타입과 void 타입은 다르기 때문에 문제가 있습니다.

Visual Studio 2008,2010에서는 Visual C++ 6.0보다 엄격한 규칙을 적용하기 때문에, 기존에 허용되던 형변환이 허용되지 않아서 생기는 문제인것 같습니다.

쉽게 말해서 LRESULT로 선언된 메소드와 구현 부분을 전부 void type으로 바꿔야 제대로 돌아간다는 이야기입니다.


Buy me a coffeeBuy me a coffee

+ Recent posts