MFC поддерживает DLL расширение. В эту DLL можно поместить свои классы производные от классов MFC, но использовать такую DLL могут только приложения MFC. Зато они могут свободно передавать и получать объекты классов. Итак, давайте создадим DLL, в которой будет класс диалога. Наш класс, но порожденный от CDiаlog. Запускаем VC и выбираем в проекте MCF AppWizard Dll.
На первом шаге нужно указать, что это DLL расширения.
Добавляем новый класс в наш проект, как наследника CDiаlog:
Добавляем ссылку на него в проект.
// TestMyClass.cpp : Defines the initialization routines for the DLL. // #include "stdafx.h" #include <afxdllx.h> #include "TestDialog.h"
Теперь немного поменяем конструктор. Дело в том, что сейчас нужно указать идентификатор диалоговой панели. Но мы то его пока не знаем.
В описании:
class AFX_EXT_CLASS CTestDialog : public CDialog { // Construction public: CTestDialog(CWnd* pParent,UINT nIDD); // standard constructor // Dialog Data //{{AFX_DATA(CTestDialog) // ...... };
В реализации:
//////////////////////////////////////////////// // CTestDialog dialog CTestDialog::CTestDialog(CWnd* pParent,UINT nIDD) : CDialog(nIDD, pParent) { //{{AFX_DATA_INIT(CTestDialog) // NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT }
Обратите внимание, что к классу добавлен модификатор:
...... class AFX_EXT_CLASS CTestDialog : public CDialog ......
AFX_EXT_CLASS говорит, что класс экспортируемый. Скомпилировав проект Вы можете увидеть, что в папке Debug находятся два нужных нам файла:
TestMyClass.dll Сама DLL TestMyClass.lib Библиотека компоновки
Попробуем использовать наш класс ??? Для этого нужно сделать TestDialog.h и TestMyClass.lib в соотвествующей папочке VC, а DLL поместить в Widows\system.
H - Program Files\Microsoft Visual Studio\VC98\Include Lib - Program Files\Microsoft Visual Studio\VC98\Lib
Давайте попробуем создать простое приложение на базе диалогового окна. На него поместим кнопку и подключим наш класс:
// TestDlgDlg.cpp : implementation file // #include "stdafx.h" #include "TestDlg.h" #include "TestDlgDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif #pragma comment(lib,"TestMyClass.lib") #include "TestDialog.h" ......
Создадим в ресурсах простое диалоговое окно с идентификатором IDD_DIALOG_TEST и испытаем наш класс.
void CTestDlgDlg::OnButton1() { CTestDialog ct(this,IDD_DIALOG_TEST); ct.DoModal(); }
Все сработает. Попробуйте сами.