У меня есть DLL с MFC (статически связанная) и основное приложение, написанное в MFC.Как создать CPaneDialog внутри динамически загружаемой DLL
Я создал CPaneDialog
и CDialog
внутри DLL, но я не могу вызвать функцию CPaneDialog::Create
внутри DLL, потому что у меня нет указателя на parentWnd. Я также не могу позвонить CPaneDialog::Create
внутри основного приложения MFC, потому что ему не хватает ресурса диалога.
Как это можно сделать?
Update
Как предложил Дэн, я теперь вызов функции создания с указателем, передаваемым в DLL:
Код внутри DLL:
extern "C" __declspec(dllexport) void init_toolbox_gui(void *ptr) {
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CPaneDialog *_gui = new CPaneDialog;
CWnd *_ptr = (CWnd*)ptr;
_gui->Create(_T("DialogBar"), _ptr, TRUE, (IDD_DIALOG1),
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
154980);
}
Это называется (основное приложение, класс, полученный от CWinAppEx
):
(...)
ToolboxInitFunc func = (ToolboxInitFunc)GetProcAddress(dll_instance, "init_toolbox_gui");
func(m_pMainWnd);
(...)
Это не работает и создает ошибки утверждения. Что может быть неправильным?
Update 2
Теперь я передаю главное окно HWND
следующим образом:
ToolboxInitFunc func = (ToolboxInitFunc)GetProcAddress(dll, "init_toolbox_gui");
func(m_pMainWnd->GetSafeHwnd());
, но я получаю следующее сообщение не удалось утверждение:
ENSURE(m_pDockManager != NULL);
Это стек вызовов
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++
Здравствуйте. Спасибо. Я просто понял, что мне не хватает знаний по этой теме. Есть ли пример с «CPaneDialog», который я могу использовать? (Я заметил, что есть некоторые примеры из чего-то, называемого MFC Feature Pack, из Visual Studio 2008, но я не могу его найти. Я использую Visual Studio 2013 btw) – manatttta
Я попытался это сделать, но я все еще получаю утверждение. Проверьте обновление, чтобы увидеть код – manatttta
Я сказал, чтобы экспортировать глобальную функцию, объявленную с помощью extern «C», а не функцию члена класса C++. –