MFC创建动态链接库DLL并调用方法详解

时间:2024-10-04 11:08:08

实例一:

1、创建一个动态链接库工程,如login_dll。

2、在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下:

#include "stdafx.h"
#define EXPORT __declspec(dllexport)
extern "C"  EXPORT  void __stdcall  Showdialg(char* pText);

3、在动态链接库源文件中定义showdialog函数,代码如下:

void _stdcall Showdialg(char* pText)
{
  MessageBox(NULL,pText,"提示一",0);
 }

注:此步编译后,即可生成dll与lib文件,因为_stdcall是一种比较流行的函数调用约定,(或者可以不用_stdcall),如果使用的时候,为了防止发生函数命令改编的情况,可以定义一个.def文件,其中加入EXPORTS节,设置导出函数名,如下所示:

LIBRARY      "login_dll"

EXPORTS
   Showdialg = Showdialg

4、创建一个基于对话框的工程。

5、定义一个函数指针类型,其定义与动态链接库的函数原型相同,代码如下:

typedef void  (__stdcall * funShowInfo)(char* pchData);

6、处理按键单击事件,加载动态链接库,代码如下:

void Cuse_login_dllDlg::OnBnClickedOk(){

HMODULE hMod = LoadLibrary("login_dll.dll");
 if (hMod != NULL)
 {
 funShowInfo ShowInfo;
ShowInfo = (funShowInfo)GetProcAddress(hMod,"Showdialg");
 if (ShowInfo)
 ShowInfo("传入参数成功且调用正常");
 }
 FreeLibrary(hMod);

其中,第5步与第6步是通过LoadLibrary函数动态加载链接库的方法,下面介绍一下静态加载链接库的方法:

1、加载链接库的头文件,将动态链接库头文件拷贝到当前工程中,并在当前工程头文件进行声明。

2、加载动态链接库文件,将动态链接库文件dll拷贝至当前工程目录下。

3、加载lib文件,#pragma comment (lib,"login_dll.lib")

4、处理按钮单击事件,调用动态链接库中的方法。

void Cuse_login_dllDlg::OnBnClickedOk(){

showdialog("传入参数成功且调用正常");

备注:用上述静态加载动态链接库不需要使用第五步中的typedef void  (__stdcall * funShowInfo)(char* pchData)来定义一个函数指针类型。

实例二:(实例二与实例一一样,仅供参考)

1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

选择“New”,至此对话框已添加到DLL工程中。

3、为对话框添加一新类,如:CTest,基类为CDialog。

4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:

extern "C" __declspec(dllexport) void Show()
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  CTest test;
  test.DoModal ();
}

别忘了在文件中添加: #include "Test.h":),大功告成,编译吧!

5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:

typedef void (WINAPI * TESTDLL)();
HINSTANCE hmod;
hmod = ::LoadLibrary ("mfcdll.dll");
if(hmod==NULL)
{
  AfxMessageBox("Fail");
}
TESTDLL lpproc;
lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
if(lpproc!=(TESTDLL)NULL)
  (*lpproc)();
FreeLibrary(hmod);

6、试试看,是不是DLL中对话框显示出来了:)