MFC创建动态链接库DLL并调用方法详解
实例一:
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中对话框显示出来了:)
MFC创建动态链接库DLL并调用方法详解的更多相关文章
- JavaScript函数的4种调用方法详解
在JavaScript中,函数是一等公民,函数在JavaScript中是一个数据类型,而非像C#或其他描述性语言那样仅仅作为一个模块来使用.函数有四种调用模式,分别是:函数调用形式.方法调用形式.构造 ...
- iOS中--NSArray调用方法详解 (李洪强)
下面的例子以 NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"to ...
- 在Linux下创建分区和文件系统的方法详解
在 Linux 中创建分区或新的文件系统通常意味着一件事:安装 Gnome Parted 分区编辑器(GParted).对于大多数 Linux 用户而言,这是唯一的办法.不过,你是否考虑过在终端创建这 ...
- 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解
本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本 ...
- Python调用C/C++动态链接库的方法详解
Python调用C/C++动态链接库的方法详解 投稿:shichen2014 这篇文章主要介绍了Python调用C/C++动态链接库的方法,需要的朋友可以参考下 本文以实例讲解了Python调用C/C ...
- vc中调用Com组件的方法详解
vc中调用Com组件的方法详解 转载自:网络,来源未知,如有知晓者请告知我.需求:1.创建myCom.dll,该COM只有一个组件,两个接口: IGetRes--方法Hello(), IGet ...
- C++调用JAVA方法详解
C++调用JAVA方法详解 博客分类: 本文主要参考http://tech.ccidnet.com/art/1081/20050413/237901_1.html 上的文章. C++ ...
- Delphi程序调用C#.Net编译的DLL并打开窗体(详解)
Delphi程序调用C#.Net编译的DLL并打开窗体(详解)最近用C#.Net写了一个公用模块, 本以为仅提供给.Net程序使用, 但是领导要求把这些功能提供给旧系统使用, 天啦, 几套旧系统全是D ...
- 22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表。然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法showB输出大写的英文字母表。最后编写主类C,在主类的main方法 中测试类A与类B。
22.编写一个类A,该类创建的对象可以调用方法showA输出小写的英文字母表.然后再编写一个A类的子类B,子类B创建的对象不仅可以调用方法showA输出小写的英文字母表,而且可以调用子类新增的方法sh ...
随机推荐
- C# 去除文件和文件夹的只读属性
当我们使用 DirectoryInfo dir = Directory.CreateDirectory(pathName) 创建目录或者创建一个文件后,有时作为临时文件用完以后需要删除掉,使用File ...
- 移动端rem适配问题
将下面这段代码,放在头部的script标签里,可解决字体适配问题 比例是28px = 1rem function __setFontSize__(){document.documentElement. ...
- TCP/IP 协议(摘抄)
TCP/IP 协议 TCP/IP 是不同的通信协议的大集合. 协议族 TCP/IP 是基于 TCP 和 IP 这两个最初的协议之上的不同的通信协议的大集合. TCP - 传输控制协议 TCP 用于从应 ...
- 转: Executor类
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,Completion ...
- 成为java高手的八大条件
1.扎实的基础 数据结构.离散数学.编译原理,这些是所有计算机科学的基础,如果不掌握它们,很难写出高水平的程序.程序人人都会写,但当你发现写到一定程度很难再提高 的时候,就应该想想是不是要回过头来学 ...
- “System.BadImageFormatException”类型的未经处理的异常在 PurchaseDevices.Access.dll 中发生 其他信息: 未能加载文件或程序集“System.Data.SQLite, Version=1.0.66.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139”或它的某一个依赖项。试图加载格式不正确
引用sqlite的程序集时,有时会报如下异常: "System.BadImageFormatException"类型的未经处理的异常在 PurchaseDevices.Acces ...
- MySQL 5.5 禁用 innodb
MySQL 5.5 禁用 innodb 编辑: my.ini 添加: default-storage-engine=MYISAM skip-innodb
- strstr() strpos() 获取db报错,判断报错中是否包含字符串,判断错误类型
model中直接获取添加公司的错误.(公司名称不能重复) $enterprise_id = $this->add($enterprisedata ); $err = $this->getD ...
- bug记录_document.defaultview.getcomputedstyle()
页面中使用document.defaultview.getcomputedstyle()在火狐下取不到值. 原本方法现在$(document).ready()中,换到window.onload里就可以 ...
- 《Intel汇编第5版》 汇编减法程序
第一步: 安装虚拟机32位XP系统 + RadAsm软件 第二步: 下载<Intel汇编语言程序设计第5版>中相关的源代码以及库文件 http://kipirvi ...