페이지

글타래

2009년 6월 14일 일요일

MFC정적으로 DLL 링크 + /MT 시 다음의 wincore.cpp 1475 line 에서 에러가 난다!

MFC정적으로 DLL 링크 + /MT 시 다음의 wincore.cpp 1475 line 에서 에러가 난다!
(다이얼로그 클래스를 DLL내부에서 호출하지 않고 EXE에서 override 하여 쓰는 경우)
즉,CResizeDialog 를 DLL에 구현하고 EXE의 CAboutDlg를 CDialog가 아닌 DLL's CResizeDialog에서 상속받아 처리한경우에 발생!

말이 보기좋게 정적링크로 DLL 사용가능하다고 한것 뿐이지 이렇게 정적 링크로 DLL을 MFC에 링크로 생성한 DLL 프로젝트에서 확장 컨트롤 클래스나 커스텀 컨트롤 클래스를 구현해놓고 이를 EXE 로 호출하면 빌드는 되더라도 EXE 런타임 에러가 난다. 그렇다면 공유 DLL 모드에서 밖에 MFC를 쓸수 밖에 없다는 말이나 마찬가지 아닌가??? 자꾸만 비대해지는 MFC DLL 들을 내프로그램과 함께 배포안하려는데..?? 방법이 음단말인가??
아니면 EXE 안에 그많은 커스텀 컨트롤 (CWnd 파생등....) 의 소스코드를 fix 시켜서 덩치를 크게 만들어야 하나.. 공유 DLL 모드에서는 참 잘 도는데,정적 DLL모드는 왜 호환이 안되는건지,,내가 모르는 다른 설정이 있는건지,, 아니면 분명히 M$의 버그나 문제로써 Feedback되어 이 문제를 해결했으면 한다.
리본바니 뭐니 지원하려고 MS에서 돈주고 껴넣은 BCG 라이브러리가 MFC에 내장되는 바람에 덩치가 한없이 커지는군...

LRESULT CWnd::OnNTCtlColor(WPARAM wParam, LPARAM lParam)
{
// fill in special struct for compatiblity with 16-bit WM_CTLCOLOR
AFX_CTLCOLOR ctl;
ctl.hDC = (HDC)wParam;
ctl.hWnd = (HWND)lParam;
_AFX_THREAD_STATE* pThreadState = _afxThreadState.GetData();
ctl.nCtlType = pThreadState->m_lastSentMsg.message - WM_CTLCOLORMSGBOX;
//ASSERT(ctl.nCtlType >= CTLCOLOR_MSGBOX);
ASSERT(ctl.nCtlType <= CTLCOLOR_STATIC);

// Note: We call the virtual WindowProc for this window directly,
// instead of calling AfxCallWindowProc, so that Default()
// will still work (it will call the Default window proc with
// the original Win32 WM_CTLCOLOR message).
return WindowProc(WM_CTLCOLOR, 0, (LPARAM)&ctl);
}

테스트 방법은 간단하다.
VC++샘플중에 DLLScreenCap 프로젝트를 열어서 DLLScreenCap DLL프로젝트에 CDialog형에서 override 한 CResizeDialog를 선언한다. 물론,
#ifdef _USRDLL //UICTRLS_EXPORTS
#define UICTRLS_API __declspec(dllexport)
#else
#define UICTRLS_API __declspec(dllimport)
#endif
식으로 export 선언해주고,,,

ScreenCap 에서 screencap.cpp ,
#include "../DllScreenCap/ResizingDialog.h"

CAboutDlg 에서 CDialog 를 CResizingDialog 로 교체한다(Replace).

Build ==> Error!

댓글 없음:

댓글 쓰기