调用mfc扩展型dll使用对话框
怎样在扩展DLL中使用对话框
VC++6.0
new->MFC AppWizard(dll)
输入名称ExtDll
选择MFC Extension DLL(using shared MFC DLL)
Finish.
添加对话框IDD_DLLDIALOG
为对话框创建新类 class CExtDialog : public CDialog
删掉ExtDialog.cpp中的#include " \ add additional includes here"这句话
在StdAfx.h中添加#include "resource.h"
否则的话,编译会出现如下错误:
extdialog.h(21) : error C2065: 'IDD_DLLDIALOG' : undeclared identifier
extdialog.h(21) : error C2057: expected constant expression
编译,ok!
修改ExtDialog.h中CExtDialog类的声明为:
class AFX_EXT_CLASS CExtDialog : public CDialog { public: CExtDialog( CWnd* pParent = NULL ); enum { IDD = IDD_DLL_DIALOG }; protected: virtual void DoDataExchange( CDataExchange* pDX ); DECLARE_MESSAGE_MAP() }; |
这其中最主要的改变是我们在class AFX_EXT_CLASS CExtDialog语句中添加了“AFX_EXT_CLASS”宏,则使得DLL中的CExtDialog类被导出。
这时,导出类还没法被使用(求牛人讲解下 这里不知道为什么 但我试了 不建立输出类CUseExtDialog 只有这个对话框类CExtDialog的话 调用dll的时候就报错 错误是error C2065: 'IDD_DIALOG1' : undeclared identifier),我们需要新建另外一个类来调用CExtDialog 类,并且把新建的类作为导出类,这样,类CExtDialog 的声明变成:
class CExtDialog : public CDialog
{
public:
CExtDialog( CWnd* pParent = NULL );
enum { IDD = IDD_DLL_DIALOG };
protected:
virtual void DoDataExchange( CDataExchange* pDX );
DECLARE_MESSAGE_MAP()
};
建立输出类:
Insert-> New Class...在打开的对话框中,"Class Type" 选择"Generic Class",Class Name 中输入
CUseExtDialog--当然你可以用其它的名称,然后"OK";
这时,需要对类CUseExtDialog稍微修改,加上: public CObject 变成
class AFX_EXT_CLASS CUseExtDialog : public CObject
{
public:
int ShowDlg();
CUseExtDialog();
virtual ~CUseExtDialog();
}; //AFX_EXT_CLASS 表示CUseExtDialog是输出类
调用ExtDialog类的对话框的函数ShowDlg()如下:
#include "ExtDialog.h" //在UseExtDialog.cpp中
int CUseExtDialog::ShowDlg()
{
CExtDialog dlg;
if (IDOK==dlg.DoModal())
{
return 1;
}
return 0;
}
在DLL工程所在的工作区中添加一个LoadExtDllDlg工程,用于演示MFC扩展DLL的加载。在LoadExtDllDlg工程中添加一个对话框,这个对话框上包括一个“调用DLL”按钮。
对应对话框类实现文件的头部添加:
// LoadExtDllDlg.cpp : implementation file // #include "..\UseExtDialog.h" #pragma comment( lib, "ExtDll.lib" ) 而“调用DLL”按钮的单击事件的消息处理函数为: void CLoadExtDllDlg::OnDllcallButton() { CUseExtDialog extDialog; if (extDialog.ShowDlg()!=0) { AfxMessageBox("ok"); } else { AfxMessageBox("cancel"); } } |
编译,运行,会出现一个对话框,点击"DLL调用"按钮,会出现DLL导出类中调用的对话框,选择"ok"会出现"ok"消息框,选择"cancel"会出现"cancel"消息框.