C++ 在MFC中创建CPanedDialog时,断言失败

C++ 在MFC中创建CPanedDialog时,断言失败,c++,dll,mfc,C++,Dll,Mfc,我有一个简单的.exe MFC项目和一个带有MFC静态链接的DLL项目。它导出以下用于创建CPanedDialog的函数: extern "C" __declspec(dllexport) void init_toolbox_gui(HWND ptr) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CPaneDialog *_gui = new CPaneDialog; CWnd *p = CWnd::FromHandle(ptr); _gu

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

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 cmfcdragframeinpl::Init(CWnd*pDraggedWnd)
中:

我可以给出该函数的完整代码,但它来自标准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++

可能有什么问题?

您不能使用“单机”对接功能

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

您得到的断言只是一个指示器,表明当前模块(您的DLL)既没有框架也没有停靠管理器来支持这种可停靠窗格


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

谢谢!但是,我希望将我的代码用于具有静态链接(/MT)的运行库。也许我应该使用另一种策略从DLL导出停靠窗格?当您想从MFC使用此功能时,无法使用静态链接。您应该始终为此使用扩展DLL。顺便说一句:为什么要使用坚忍的链接。它需要更多的内存。加载这样多个DLL的速度越慢,MFC功能的灵活性就越低……但我可以将运行时链接也用作静态链接吗?i、 e./mt只有在共享DLL版本中使用MFC和CRT时,才能执行此操作。您坚持静态链接的原因是什么。当使用使用标准DLL的独立程序时,这是正常的。当使用复杂的DLL szenarios和插件技术时,我会说在共享庄园中使用CRT in和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++