본문 바로가기
개발 및 운영/프로그래밍

C++ & AFX(MFC) 환경에서 사용자 정의 메세지 사용하면서 SendMessage으로 메세지 호출할 때 Run-Time Check Failure

by Joseph.Lee 2019. 6. 27.

C++ & AFX(MFC) 환경에서 사용자 정의 메세지 사용하면서 SendMessage으로 메세지 호출할 떄...

Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

위와 같은 오류가 났던 경우가 있었습니다.

이틀동안 엄청 삽질했는데... 보통 이런경우 메모리가 꼬여서 (Overflow/일부 메모리 free등) 문제가 발생했었는데...

쨋든 이번에는 상속과 관련된 복잡한 문제였다.

일단 소스 구조는 아래와 같았다.

class ITestWindow {
public:
    virtual afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam) = 0;
};

class CTestWindow : public CFrameWnd, public ITestWindow
{
public:
    afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam) override { ... }
}

BEGIN_MESSAGE_MAP(CTestWindow, CFrameWnd)
    ON_MESSAGE(WM_MYMSG, OnMyMsg)
END_MESSAGE_MAP()

이런 상황에서

CTestWindow *wnd;
wnd->SendMessage(WM_MYMSG); // 이런 경우에...

wincore.cppCWnd::OnWndMsg 에서 해당 Run-time check error가 떴었다.

해당 함수는 지정한 MessageMap에서 해당 메서드를 콜백하는 부분인데..

좀 더 원인을 찾아보니 OnMyMsg가 아니라 완전 다른 메서드(~CTestWindow())가 호출되어버렸다...

(뭐야이게????)

암튼 결론은.. 아래와 같이

class ITestWindow {
public:
    // virtual afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam) = 0; 지워버림
};

class CTestWindow : public CFrameWnd, public ITestWindow
{
public:
    afx_msg LRESULT OnMyMsg(WPARAM wParam, LPARAM lParam) /* override 지움 */ { ... }
}

이렇게 virtual method를 사용하지 않음으로써 해결했다...

반응형

'개발 및 운영 > 프로그래밍' 카테고리의 다른 글

C++ istream, streambuf 간단 구현 예제  (0) 2019.07.19
EJBCA Java WS API 연결  (0) 2019.07.10
안전한 IOCP 프로그래밍  (0) 2019.06.23
OpenSSL FIPS 빌드  (0) 2019.06.19
WindowsPE에서 디버깅하기  (0) 2018.11.07

댓글