2015-04-21 6 views
-1

У меня есть 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++ 

ответ

1

Вы можете передать NULL в качестве родительского окна в конструктор диалога MFC или в CPaneDialog :: Create(). Фактически, если вы посмотрите CDialog::Create(), параметр CWnd * pParentWnd является необязательным и по умолчанию имеет значение NULL, а в документе указано: «Если он равен NULL, родительское окно диалогового объекта установлено в основное окно приложения».

Но вы, вероятно, хотите иметь глобальную функцию «C», экспортированную из DLL, которая принимает HWND родительского окна в качестве параметра, а затем вызывает CWnd::FromHandle() с переданным HWND и использует это как родительский CWnd в вызовите CPaneDialog :: Create(). Экспортированная функция должна начинаться с AFX_MANAGE_STATE(AfxGetStaticModuleState());, чтобы правильно загружать ресурсы из DLL.

+0

Здравствуйте. Спасибо. Я просто понял, что мне не хватает знаний по этой теме. Есть ли пример с «CPaneDialog», который я могу использовать? (Я заметил, что есть некоторые примеры из чего-то, называемого MFC Feature Pack, из Visual Studio 2008, но я не могу его найти. Я использую Visual Studio 2013 btw) – manatttta

+0

Я попытался это сделать, но я все еще получаю утверждение. Проверьте обновление, чтобы увидеть код – manatttta

+0

Я сказал, чтобы экспортировать глобальную функцию, объявленную с помощью extern «C», а не функцию члена класса C++. –

Смежные вопросы