调用mfc扩展型dll使用对话框

来源:互联网 发布:网络公益活动有哪些 编辑:程序博客网 时间:2024/04/30 06:42
怎样在扩展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"消息框.

原创粉丝点击