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 ...
随机推荐
- 使用webview加载html图片、表单超屏幕问题
webView加载html代码时,使用webView自带的 scalesPageToFit 可以解决图片所带来的超过屏幕问题:但是,所带来的问题就是文字变小了,怎样让图片边小,并且文字还是原来html ...
- HTML canvas图像裁剪
canvas drawImage方法的图像裁剪理解可能会比较耗时,记录一下,以便供人翻阅! context.drawImage(img,sx,sy,swidth,sheight,x,y,width,h ...
- linux的用户,群组和其他用户
1 linux 安全模型:(多任务,多用户的操作系统) 1)使用user和group控制使用者对文件的存储权限. 2)用户使用账户和口令登录linux 3)每个文件都有owner(创建者),owner ...
- RabbitMQ队列
AMQP ,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无 ...
- cxf 报错:java.lang.NoSuchMethodError: org.apache.ws.commons.schema.XmlSchemaCollection.read(Lorg/w3c/dom/Document;Ljava/lang/String;)
由于没有仔细查看官方提供的文档,由jdk版本不一致导致的出错: http://cxf.apache.org/cxf-316-release-notes.html 自己使用的是jdk1.8. 报Exce ...
- jquery事件绑定
window.onload 和 Jquery $(document).ready() 区别 * .用JavaScript的方式window.onload :必须等页面上所有的元素(css/js/图片) ...
- Golang的"泛型"模式
只要实现了Sortable接口的所有方法,就可以使用该接口的函数. 我们通过冒泡排序来演示一下: package main import "fmt" type Sortable i ...
- SpringMVC之ModelAndView的简单使用
可以使用ModelAndView来跳转页面和传值,具体用法如下: 构造方法的参数是要跳转的页面! 通过 ModelAndView 的对象的 AddObject(K,V)方法,可以传入数据! 获得mod ...
- 忘记linux用户名和密码怎么解决?
开机进入单用户模式,可跳过密码验证修改root密码. 具体步骤如下: 开机读秒时键盘上按回车 通过操纵键盘上下方向键选择系统版本,然后按下E 通过操纵键盘上下方向键选择kernel所在行,再次按下E进 ...
- android自定义控件(理论知识学习 +自定义属性的讲解)
View树和UI界面架构图 UI界面架构图: android视图最外层是一个window对象. phoneWindow来实现. phoneWindow将一个decorView作为整个布局的根vie ...