[질문]winapi GUI를 C++로 추상화. this 포인터 넘기기
글쓴이: ipes4579 / 작성시간: 화, 2011/03/29 - 4:07오후
winapi의 GUI들을 C++로 추상화해보신 분 계신가요?
작은 윈도우 프로젝트의 유지보수를 맡게 되었는데 코드도 너무 길고 난잡해서 도저히 손댈 수가 없네요 -_-;
그래서 이 난잡한 api들을 C++로 추상화해서 추후의 요구사항 변경에도 원할히 대처하려고 하는데
아.. 꽤 어렵습니다. 걍 MFC로 다시 만들까 심각하게 고민할 정도로..
특히, 지금 난항을 겪고 있는 부분이(이게 주 질문입니다)
다이얼로그의 메시지 콜백함수로 this 포인터 넘기는게 너무 난해합니다.
//dlg.h class Dlg { public: static INT_PTR CALLBACK messageProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); BOOL getIp(std::string &hostIp){hostIp = m_hostIp; return TRUE;} .... private: static Dlg *_this; ... ... }
//dlg.cpp INT_PTR CALLBACK Dlg::messageProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) { if(_this == NULL) _this = new Dlg(); std::string hostIp; _this->getIp(hostIp); switch (message) { case WM_INITDIALOG: break; } }
제 생각엔 이게 최선인 것 같은데
error LNK2001: "public: static class Dlg * Dlg::_this" (?_this@Dlg@@2PAV1@A) 외부 기호를 확인할 수 없습니다.
위와 같은 에러가 나네요.
계속 머리 싸매고 있습니다. 검색 능력도 미천해서 잘 안나오고.. 고수님들 부탁드립니다.
Forums:
혹시 dlg.cpp에 (혹은 어디든 *.cpp
혹시 dlg.cpp에 (혹은 어디든 *.cpp 파일에)
Dlg::Dlg *this;
정의가 빠진 것은 아닌지요?
C++과 win32를 해본지 오래되서 기억이 가물가물합니다만, 개인적으로는 Get/SetWindowLongPtr(DWLP_USER)를 선호했던 것 같네요.
에고, Dlg* Dlg::_this; 가 맞는
에고,
Dlg* Dlg::_this;
가 맞는 문법이었던듯
API도 잘 쓰면 그럭저럭 괜찮습니다.
원래 그게 callback procedure 처리가 어렵죠. MFC도 Qt도 WTL도 다 동일하게 고민한 문제입니다. 가장 먼저 떠올릴 수 있을만한게 MFC 방식이라...
winapi를 직접 만져본적이 없어서, 엉뚱한
winapi를 직접 만져본적이 없어서, 엉뚱한 대답일수도 있습니다.
콜백함수에 유저 데이터를 넘길 공간이 없다면, 적어도 핸들값은 각 윈도우의 고유값일테니, 이값을 키로하는 전역 해쉬테이블을 이용하여 this포인터를 저장해두면 될것같습니다.
적으신 방법은 Dlg객체가 단 하나만 이용가능해보입니다.
핸들값이 어느시점에서 결정되는지는 모르겠지만, 핸들값이 결정될때 해쉬테이블에 등록하면 되겠지요.
STL을 쓴다면 std::map을 이용하면 될테구요.
윈도우는 메시지 방식을 사용하니까요.
SendMessage. PostMessage로 포인터를 넘겨주셔도 될거같습니다.
----------------------------------------------------------------------------
젊음'은 모든것을 가능하게 만든다.
매일 1억명이 사용하는 프로그램을 함께 만들어보고 싶습니다.
정규 근로 시간을 지키는. 야근 없는 회사와 거래합니다.
각 분야별. 좋은 책'이나 사이트' 블로그' 링크 소개 받습니다. shintx@naver.com
댓글 달기