Windows下动态库的编译以及调用
1.MFC下生成动态库
1>显式调用
在.cpp文件里添加接口函数
int sum(int a,int b)
{
return a + b;
} int sub(int a,int b)
{
return a - b;
}
在.def文件里标示导出接口
sum @; sub @;
编译即可生成动态库
在.exe里调用
在头文件里添加
#pragma comment(lib,"TestDLL")
int sum(int a,int b);
int sub(int a,int b);
public:
void InitAll();
CString decToStr(int dec); public:
CString str1,str2;
int a,b;
Button事件
void CTestDlgDlg::OnButtonAdd()
{
// TODO: Add your control notification handler code here
InitAll();
int c = sum(a,b);
CString sum1 = decToStr(c);
SetDlgItemText(IDC_EDIT3,sum1);
}
void CTestDlgDlg::OnButtonSub()
{
// TODO: Add your control notification handler code here
InitAll();
int d = sub(a,b);
CString Sub = decToStr(d);
SetDlgItemText(IDC_EDIT4,Sub);
}
void CTestDlgDlg::InitAll()
{
UpdateData(TRUE);
GetDlgItemText(IDC_EDIT1,str1);
GetDlgItemText(IDC_EDIT2,str2);
a = atoi(str1);
b = atoi(str2);
} CString CTestDlgDlg::decToStr(int dec)
{
CString str;
str.Format(_T("%d"),dec);
return str;
}
然后将相应的.dll和.lib拷贝到相应目录即可。
2>隐式调用
在头文件里添加
typedef int (*PFUNC)(int,int);
HMODULE hDllLib; PFUNC m_pSum; PFUNC m_pSub;
在BOOL CTestDlgDlg::OnInitDialog()里添加
hDllLib = LoadLibrary("TestDll.dll");
if (hDllLib == NULL)
{
AfxMessageBox("dll load error");
return FALSE;
}
m_pSum = (PFUNC)(GetProcAddress(hDllLib,"sum"));
m_pSub = (PFUNC)(GetProcAddress(hDllLib,"sub"));
其他相应代码
void CTestDlgDlg::OnButtonAdd()
{
// TODO: Add your control notification handler code here
InitAll();
int c= m_pSum(a,b);
CString sum1 = decToStr(c);
SetDlgItemText(IDC_EDIT3,sum1);
} void CTestDlgDlg::OnButtonSub()
{
// TODO: Add your control notification handler code here
InitAll();
int d = m_pSub(a,b);
CString Sub = decToStr(d);
SetDlgItemText(IDC_EDIT4,Sub);
} void CTestDlgDlg::InitAll()
{
UpdateData(TRUE);
GetDlgItemText(IDC_EDIT1,str1);
GetDlgItemText(IDC_EDIT2,str2);
a = atoi(str1);
b = atoi(str2);
} CString CTestDlgDlg::decToStr(int dec)
{
CString str;
str.Format(_T("%d"),dec);
return str;
}
2.Win32下动态库生成及调用
动态库头文件里添加
extern "C" WIN32DLL_API int sum(int a,int b);
extern "C" WIN3
2DLL_API int sub(int a,int b);
.cpp文件里添加
extern "C" WIN32DLL_API int sum(int a,int b)
{
return a + b;
} extern "C" WIN32DLL_API int sub(int a,int b)
{
return a - b;
}
编译即生成动态库
调用
在.exe头文件里添加
#pragma comment(lib,"Win32DLL") extern "C" int sum(int a,int b);
extern "C" int sub(int a,int b);
其他相应文件
void CTestDlgDlg::OnButtonAdd()
{
// TODO: Add your control notification handler code here
InitAll();
int c = sum(a,b);
CString sum1 = decToStr(c);
SetDlgItemText(IDC_EDIT3,sum1);
} void CTestDlgDlg::OnButtonSub()
{
// TODO: Add your control notification handler code here
InitAll();
int d = sub(a,b);
CString Sub = decToStr(d);
SetDlgItemText(IDC_EDIT4,Sub);
} void CTestDlgDlg::InitAll()
{
UpdateData(TRUE);
GetDlgItemText(IDC_EDIT1,str1);
GetDlgItemText(IDC_EDIT2,str2);
a = atoi(str1);
b = atoi(str2);
} CString CTestDlgDlg::decToStr(int dec)
{
CString str;
str.Format(_T("%d"),dec);
return str;
}
以上代码通过测试!
Windows下动态库的编译以及调用的更多相关文章
- Windows下动态库的隐式调用
多年的工作经验告诉我Windows下使用动态库最简单的方法:使用def导出函数,然后隐式调用. 具体做法如下: (1)首先使用visual studio 创建“Win32项目”,如下图: (2)然后在 ...
- c++动态库封装及调用(2、windows下动态库创建)
DLL即动态链接库(Dynamic-Link Libaray)的缩写,相当于Linux下的共享对象.Windows系统中大量采用了DLL机制,甚至内核的结构很大程度依赖与DLL机制.Windows下的 ...
- C++之条形码,windows下zint库的编译及应用(二)
zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用. 0windows下zint库的编译及应用(一) 工具/原料 vs2012 生成条形 ...
- c++动态库封装及调用(3、windows下动态库调用)
1.DLL的隐式调用 隐式链接采用静态加载的方式,比较简单,需要.h..lib..dll三件套.新建“控制台应用程序”或“空项目”.配置如下: 项目->属性->配置属性->VC++ ...
- C++之条形码,windows下zint库的编译及应用(一)
zint库是一个开源的第三方库,提供了生成条形码.二维码等功能.本文主要介绍zint库的生成及简单应用. 工具/原料 vs2012 代码文件下载 1 下载zint包 2 zint依赖另外两个库 ...
- Windows下动态库的制作与使用
创建静态库
- Windows下zlib库和libPng库的编译和使用
关于zlib库和libpng是干嘛的,我就不说了,度娘和谷歌都能告诉你.这里主要记录下windows下如何利用vs2010编译和使用这两个库. 一.zlib库的编译 首先要下载这个库,这个谷歌和百度也 ...
- windows 动态库的封装以及调用
1.一个程序从源文件编译生成可执行文件的步骤:预编译 --> 编译 --> 汇编 --> 链接(1)预编译,即预处理,主要处理在源代码文件中以“#”开始的预编译指令,如宏展开.处 ...
- Windows下静态库与动态库的创建与使用
Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...
随机推荐
- Struts2第四天
Struts2第四天 昨天: 自定义的拦截器:继续methodFilterInterceptor,可以指定哪些方法需要拦截或者不拦截. Intercepters(配置拦截器),intercepter( ...
- 浏览器 CSS 兼容写法的测试总结
做前端最讨厌的就是 IE6,7,8,虽然被淘汰的浏览器,但是在中国用户仍然很多,不可能像国外网站一样直接就不管它了,这样会流失很多流量啊. 现在有了IE9,IE10还好些,几乎和 Chrome,Fir ...
- Python读取ini配置文件
db_config.ini [baseconf] host=127.0.0.1 port=3306 user=root password=root db_name=evaluting_sys [con ...
- iframe、flash引入
iframe引入 <iframe src="" width="" height="" frameborder="0" ...
- javascript动画:velocity.js学习
第二章:基础知识 一.velocity和jQuery: Velocity函数是独立于jQuery的,但两者可以结合使用.通常这么做的好处是可以利用jQuery的链式操作:当你先用jQuery选择了一个 ...
- git 和 svn
GIT和SVN之间的五个基本区别 如果你在读这篇文章,说明你跟大多数开发者一样对GIT感兴趣,如果你还没有机会来试一试GIT,我想现在你就要了解它了. GIT不仅仅是个版本控制系统,它也是个内容管理系 ...
- Spring入门学习(二)三种实例化bean的方法
前面的哪一种就是通过构造函数来实例化对象 下面我们可能用到工厂方法来视力话对象,这样我们的配置文件又该怎么配置呢 <bean name="service2" class=&q ...
- hdu 1072 广搜
路径是可以重复走的,但是如果再一次走过时间重置点是没有意义的 #include <iostream> #include <cstdio> #include <cstrin ...
- HUST 1358 Uiwurerirexb jeqvad(模拟解密)
Uiwurerirexb jeqvad Description Fmur lan oxbrvu mzx, E abpxcay Jvmffabza qdxwfaou eb vmjsad.xdz, eb ...
- php基础的第一天 任务点滴,event对象方法概括 ing....
day1 任务 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <t ...