mfc调用dll的方法汇总

本文详细介绍了如何在MFC应用程序中调用DLL中的对话框,包括常规DLL和MFC扩展DLL的调用方法。通过示例代码展示了从DLL加载、对话框类的创建到最终调用的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、调用常规的dll.
1..dll代码工程里面与def文件名称相同的cpp文件里面添加
#include "窗口文件名称"
typedef __declspec(dllexport) void show()
{
   AFX_MANAGE_STATE(AfxGetStaticModuleState());
    窗口类名  dlg;
    dlg.DoModal();
}


2.在exe按钮事件中进行调用
void CCallDllDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
typedef void (WINAPI * TESTDLL)();


HINSTANCE hmod;
hmod = ::LoadLibrary ("WordChat_Dll.dll");
if(hmod==NULL)
{
AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress(hmod,"ShowChatDlg");
if(lpproc!=(TESTDLL)NULL)
(*lpproc)();
FreeLibrary(hmod);

}


二、对于扩展的dll的调用

一)、在对话框中点击按钮调用扩展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"消息框.



二)、在单文档中调用dll
<一>
1.在def文件中填写接口函数
2.在cpp中使用extern 要打开的窗口的类名 *pTestDlg;//pTestDlg在该类名的cpp文件中已经定义并赋值为NULL
3.写接口函数,形参为CView *pView
4.函数中写入
  if(pTestDlg == NULL)
   {
     pTestDlg = new 类名;
     pTestDlg.Create(窗口资源IDD,pTestDlg);
}
 pTestDlg.ShowWindow(SW_SHOW);
<二>在单文档中添加一个菜单项目,并在view文件定义该项的事件定义和函数的实现,在该函数中的代码如下:
typedef void (*lpShowDlg)(CView *p_View);
typedef void (*lpHideDlg)();
HINSTANCE hDll; //DLL句柄 

hDll = NULL; //DLL句柄
hDll = LoadLibrary("ContractDll.dll");

if (NULL==hDll)
{
MessageBox("Operation_DLL加载失败");
return;
}

lpShowDlg pShowDlg;
// lpHideDlg pHideDlg;

pShowDlg = (lpShowDlg)GetProcAddress(hDll, "ContractShow");
// pHideDlg = (lpHideDlg)GetProcAddress(hDll, "ReleaseQuery_Hide");

if(NULL == pShowDlg)
{
MessageBox("ReleaseQueryDll中FodderAudit_Show函数寻找失败!"); 
return;
}
// else if(NULL == pHideDlg)
// {
// MessageBox("ReleaseQueryDll中ReleaseQuery_Hide函数寻找失败!"); 
// return;
// }
pShowDlg(this);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值