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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 在MFC工程中调用DLL中的对话框,需要进行以下步骤: 1. 在MFC工程的资源文件夹中创建一个对话框资源文件(.dlg)。 2. 编写一个导出函数,在该函数中创建并显示上述对话框,并将其作为返回值返回。 3. 在DLL代码中添加导出函数的定义和声明,可以使用__declspec(dllexport)声明该函数为导出函数。 4. 在MFC工程中使用LoadLibrary函数加载该DLL,并使用GetProcAddress函数获取导出函数的地址。 5. 使用获得的函数指针调用导出函数,获取对话框句柄并显示对话框。 6. 对话框处理完成后,调用EndDialog函数将结果返回给MFC工程。 通过上述步骤,就可以在MFC工程中调用DLL中的对话框了。需要注意的是,在使用DLL中的资源文件时,必须在MFC应用程序中调用AfxSetResourceHandle以确保使用正确的资源句柄。 ### 回答2: MFC是微软公司开发的一套基于Windows操作系统的应用程序框架。在MFC中,可以使用CDialog类创建对话框DLL是一种动态链接库,它允许在不同的应用程序之间共享代码和数据。假设现在需要在MFC调用DLL中的对话框,则可以按照以下步骤进行操作: 1. 在DLL中创建对话框 首先,在DLL中创建一个对话框资源,并使用CDialog类派生一个对话框类。例如: class CDllDialog : public CDialog { public: CDllDialog(CWnd* pParent = NULL); enum { IDD = IDD_DLGDIALOG }; protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() }; 在此类中,可以根据需要添加控件和处理函数。 2. 在DLL中导出对话框类 接下来,需要在DLL中将对话框类导出,以便能够在MFC使用。在DLL中添加以下代码: extern "C" __declspec(dllexport) CDialog* CreateDialog() { return new CDllDialog(); } 此代码将CreateDialog函数导出为一个公共的DLL函数,并返回一个CDllDialog对象。 3. 在MFC调用DLL中的对话框 现在,在MFC中可以使用以下代码调用DLL中的对话框: #include "windows.h" #include "afxwin.h" typedef CDialog* (*fnCreateDialog)(); void CallDllDialog() { HMODULE hDll = LoadLibrary(_T("mydll.dll")); if (hDll != NULL) { fnCreateDialog pfnCreateDialog = (fnCreateDialog)GetProcAddress(hDll, "CreateDialog"); if (pfnCreateDialog != NULL) { CDialog* pDlg = (*pfnCreateDialog)(); if (pDlg != NULL) { pDlg->DoModal(); delete pDlg; } } FreeLibrary(hDll); } } 此代码首先使用LoadLibrary函数加载DLL文件,然后使用GetProcAddress函数获取CreateDialog函数的指针。如果成功获取到函数指针,则可以使用该函数创建CDllDialog对象,并调用DoModal函数显示对话框。 总之,调用DLL中的对话框需要在DLL中创建对话框类并导出,然后在MFC使用LoadLibrary函数和GetProcAddress函数获取函数指针,并创建对话框对象进行操作。 ### 回答3: 在MFC中可以使用LoadLibrary函数来加载DLL,并且使用GetProcAddress函数来获取DLL中的函数地址,然后调用DLL中的函数实现对话框调用。 以下是实现步骤: 1. 定义DLL的头文件 首先需要在MFC工程中定义DLL的头文件,包含DLL中的函数声明和结构体定义等内容。 2. 加载DLL 在需要使用DLL中函数的地方调用LoadLibrary函数来加载DLL,并保存句柄。 HINSTANCE hDll = LoadLibrary(L"MyDialog.dll"); 3. 获取函数地址 使用GetProcAddress函数获取DLL中需要调用的函数的地址。在DLL中,对话框的导出函数名为“ShowMyDialog”,因此可以使用以下代码获取该函数的地址。 typedef void (*PFDialogFunc)(); PFDialogFunc pFunc = (PFDialogFunc)GetProcAddress(hDll, "ShowMyDialog"); 4. 调用函数 获取到函数地址以后就可以通过函数指针来调用该函数,并显示对话框。 if (pFunc != NULL) { (*pFunc)(); } 在DLL中定义的导出函数需要以“__declspec(dllexport)”修饰符进行修饰,例如: __declspec(dllexport) void ShowMyDialog() { CMyDialog dlg; dlg.DoModal(); } 需要注意的是,如果DLL中的对话框涉及到资源(如图片等),需要将资源文件一并打包到DLL中。另外,DLL的编译选项也需要与主工程保持一致。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值