• 调用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"消息框.

  • 相关阅读:
    什么是软件架构?
    子系统、框架与架构
    今天开始锻炼身体
    程序语言中基本数值类型的分类
    软件架构的作用
    软件架构要设计到什么程度
    软件架构视图
    更多资料
    How to:如何在调用外部文件时调试文件路径(常见于使用LaunchAppAndWait和LaunchApp函数)
    installshield卸载时提示重启动的原因以及解决办法
  • 原文地址:https://www.cnblogs.com/moher/p/2909065.html
Copyright © 2020-2023  润新知