afxMapHWND with Shared Release DLL
Hi!
I've been working on some interface DLL's recently that pass a CWnd back to
a main EXE. Everything works fine in DEBUG mode. As soon as I go over to a
RELEASE version I get:
- error LNK2019: unresolved external symbol "class CHandleMap * __stdcall
afxMapHWND(int)" (?afxMapHWND@@YGPAVCHandleMap@@H@Z)
Now this is rather interesting as I did a search on the net and found that
this function is not in the MFC71.lib but is in the MFC71D.lib. If I
comment out the code like:
#ifdef _DEBUG
afxMapHWND(TRUE);
#endif
m_lpParent = new CWnd();
m_lpParent->Attach(lpParent->GetSafeHwnd());;
return CreateDlgIndirect(lpDialogTemplate, m_lpParent, hInstance);
It will build fine but will assert the application on close:
//within CWnd::DestroyWindow()
CHandleMap *pMap;
pMap = afxMapHWND();
ASSERT(pMap != NULL);
Also I can STATICALLY link the MFC DLL to the program... but this increases
my DLL's size from 96Kb to 600Kb. When I'm trying to keep sizes to a
minimum this is too much. My DEBUG DLL is only 160Kb itself.
Now my question is how I can link into the library file to have this
afxMapHWND function dynamically linked to my DLL? I found a post stating it
is in nafxcw.lib and uafxcw.lib but when I add this (one or the other, not
both) into my additional dependencies I get:
- error LNK2005: _RawDllMain@12 already defined in nafxcw.lib(dllmodul.obj)
- error LNK2005: _DllMain@12 already defined in nafxcw.lib(dllmodul.obj)
- error LNK2005: __pRawDllMain already defined in nafxcw.lib(dllmodul.obj)
- error LNK2005: __afxForceUSRDLL already defined in
nafxcw.lib(dllmodul.obj)
- warning LNK4006: _RawDllMain@12 already defined in
nafxcw.lib(dllmodul.obj); second definition ignored
- warning LNK4006: _DllMain@12 already defined in nafxcw.lib(dllmodul.obj);
second definition ignored
- warning LNK4006: __pRawDllMain already defined in
nafxcw.lib(dllmodul.obj); second definition ignored
- warning LNK4006: __afxForceUSRDLL already defined in
nafxcw.lib(dllmodul.obj); second definition ignored
- warning LNK4098: defaultlib 'mfc71.lib' conflicts with use of other libs;
use /NODEFAULTLIB:library
- warning LNK4098: defaultlib 'mfcs71.lib' conflicts with use of other
libs; use /NODEFAULTLIB:library
- error LNK2001: unresolved external symbol ___argv
- error LNK2001: unresolved external symbol ___argc
- error LNK2001: unresolved external symbol __mbctype
- error LNK2019: unresolved external symbol __mbctype referenced in
function "void __stdcall _AfxAbbreviateName(char *,int,int)"
(?_AfxAbbreviateName@@YGXPADHH@Z)
- error LNK2001: unresolved external symbol __mbctype
- fatal error LNK1120: 3 unresolved externals
Is there a way around this? The code sample below shows what it is doing:
int LoadGUI(CWnd *lpParent, CDialog **lpChild)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE hInst;
HRSRC hResource;
HGLOBAL hTemplate;
LPCDLGTEMPLATE lpDialogTemplate;
hInst = AfxFindResourceHandle(MAKEINTRESOURCE(IDD_MAIN_DIALOG),
RT_DIALOG);
hResource = ::FindResource(hInst, MAKEINTRESOURCE(IDD_MAIN_DIALOG),
RT_DIALOG);
hTemplate = LoadResource(hInst, hResource);
lpDialogTemplate = (LPCDLGTEMPLATE) LockResource(hTemplate);
theApp.m_lpMainDialog = new CMyDlg(lpParent, theApp.m_clrBackground);
theApp.m_lpMainDialog->AttachControlSite(lpParent);
theApp.m_lpMainDialog->Create(lpDialogTemplate, lpParent, hInst);
(*lpChild) = theApp.m_lpMainDialog;
if ((*lpChild) != NULL)
{
return 1;
}
else
{
return 0;
}
}
and
BOOL CMyDlg::Create(LPCDLGTEMPLATE lpDialogTemplate, CWnd *lpParent,
HINSTANCE hInstance)
{
#ifdef _DEBUG
afxMapHWND(TRUE);
#endif
m_lpParent = new CWnd();
m_lpParent->Attach(lpParent->GetSafeHwnd());;
return CreateDlgIndirect(lpDialogTemplate, m_lpParent, hInstance);
}
The LoadGUI is passed called from the parent EXE inside the GUI DLL. Hope
this makes sense :).
Thanks in advance.
DSXC