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.cpp
의 CWnd::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 |
댓글