在MFC中创建CPaneDialog时断言失败

时间:2015-04-22 11:52:19

标签: c++ dll mfc

我有一个简单的.exe MFC项目和一个与MFC静态链接的DLL项目。它导出以下用于创建CPaneDialog的函数:

extern "C" __declspec(dllexport) void init_toolbox_gui(HWND ptr) {

AFX_MANAGE_STATE(AfxGetStaticModuleState());

CPaneDialog *_gui = new CPaneDialog;
CWnd *p = CWnd::FromHandle(ptr);

_gui->Create(_T("DialogBar"), p, TRUE, (IDD_DIALOG1),
    WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_LEFT | CBRS_FLOAT_MULTI,
    0);

}

我从我的主.exe应用程序类(派生自CWinAppEx)调用此内容,如下所示:

// dll is a handle to the DLL lib
ToolboxInitFunc func = (ToolboxInitFunc)GetProcAddress(dll, "init_toolbox_gui"); 

func(m_pMainWnd->GetSafeHwnd());

void CMFCDragFrameImpl::Init(CWnd* pDraggedWnd)中的以下调试断言中失败:

m_pDockManager = afxGlobalUtils.GetDockingManager(pDockSite);
ENSURE(m_pDockManager != NULL);

我可以提供该函数的完整代码,但它来自标准的MFC库。

这是调用堆栈:

toolbox-3d.dll!CMFCDragFrameImpl::Init(CWnd * pDraggedWnd) Line 106 C++
toolbox-3d.dll!CPane::CreateEx(unsigned long dwStyleEx, const wchar_t * lpszClassName, unsigned long dwStyle, const tagRECT & rect, CWnd * pParentWnd, unsigned int nID, unsigned long dwControlBarStyle, CCreateContext * pContext) Line 177   C++
toolbox-3d.dll!CDockablePane::CreateEx(unsigned long dwStyleEx, const wchar_t * lpszCaption, CWnd * pParentWnd, const tagRECT & rect, int bHasGripper, unsigned int nID, unsigned long dwStyle, unsigned long dwTabbedStyle, unsigned long dwControlBarStyle, CCreateContext * pContext) Line 175   C++
toolbox-3d.dll!CDockablePane::Create(const wchar_t * lpszWindowName, CWnd * pParentWnd, CSize sizeDefault, int bHasGripper, unsigned int nID, unsigned long dwStyle, unsigned long dwTabbedStyle, unsigned long dwControlBarStyle) Line 148 C++
toolbox-3d.dll!CPaneDialog::Create(const wchar_t * lpszWindowName, CWnd * pParentWnd, int bHasGripper, const wchar_t * lpszTemplateName, unsigned int nStyle, unsigned int nID, unsigned long dwTabbedStyle, unsigned long dwControlBarStyle) Line 48   C++
toolbox-3d.dll!CPaneDialog::Create(const wchar_t * lpszWindowName, CWnd * pParentWnd, int bHasGripper, unsigned int nIDTemplate, unsigned int nStyle, unsigned int nID) Line 42 C++
toolbox-3d.dll!init_toolbox_gui(HWND__ * ptr) Line 45   C++

可能出现什么问题?

1 个答案:

答案 0 :(得分:4)

您无法使用对接功能"独立"。

这种对接需要一个特别准备的CFrameWndEx类。如果MFC项目使用这样的类,则当您要使用DLL时,您将被迫使用动态链接的MFC。

你得到的ASSERT只是指示当前模块(你的DLL),既没有框架也没有停靠管理器来支持这种可停靠的窗格。

原因很简单。静态链接的EXE和DLL将只使用自己的CObject表示,因此MFC内部使用的所有IsKindOf调用只能在模块内部工作。