C++windows内核编程笔记day11 win32静态库和动态库的使用
windows库程序:
静态库:
源码被链接到调用的程序或动态库,被调用时,代码最少有1份,文件后缀.LIB
动态库: 函数被程序或其它动态库调用,被调用时,代码仅仅有1份,文件后缀.DLL
静态库(C语言):
创建时,选择文本类型文件,输入Clib.c,设置输出路径 ../lib/Clib.lib
int Clib_add(int a,int b)
{
return a+b;
}
同一上工作区,建立控制台程序(.c文件)调用静态库:
#include<STDIO.H>
#pragma comment(lib,"../lib/Clib.lib") //包括静态库文件
//能够在 project-设置-连接-对象/库模块 中增加静态库相对地址 ../lib/Clib.lib
int main()
{
int sum=Clib_add(12,34);
printf("12+34 结果是:%d\n",sum);
return 0;
}
C++程序调用C++静态库,与C中大部分一样。但调用之前。要写函数声明。
C++程序调用C静态库。写函数声明时。前面加 extern "C".
使用静态库演示样例:
新建 win32 static libraryproject(Clib):
新建一个文件。Clib.c,代码:
int Clib_add(int a,int b)
{
return a+b;
}
int Clib_sub(int a,int b)
{
return a-b;
}
生成,产生一个 Clib.lib文件。
新建C控制台程序。使用静态库,代码:
#include<STDIO.H>
#pragma comment(lib,"../lib/Clib.lib") //包括静态库文件
//能够在 project-设置-连接-对象/库模块 中增加静态库相对地址 ../lib/Clib.lib
int main()
{
int sum=Clib_add(12,34);
printf("12+34 结果是:%d\n",sum);
return 0;
}
动态库:
(项目:Cdll):
在函数前加 _declspec(dllexport),声明方式导出动态库函数地址到.lib。
生成的.dll和.lib(.lib要手动拷贝到lib目录)。
C程序调用:
#pragma comment(lib,"../lib/Cdll.lib")//函数地址文件
//在执行时,Cdll.dll文件要放在与程序同一文件夹中或系统PATH文件夹中
//(隐式链接动态库dll)
C++程序调用C++动态库,与C中大部分一样,但调用之前,要写函数声明。
C++程序调用C动态库,写函数声明时,前面加 extern "C".
显式链接dll的方法(不使用lib文件。要建立.def文件):
1.定义函数指针类型
2.载入动态库
3.获取函数地址
4.使用函数
5.卸载动态库
.def文件格式:
LIBRARY CPPdll
EXPORTS
CPPdll_add @1
CPPdll_sub @2
CPPdll_multi @3
演示样例:
新建动态库Cdll项目。win32 Dynamic-link library
新建一个Cdll.c文件,内容:
_declspec(dllexport) int Cdll_add(int a,int b)
{
return a+b;
}
新建一个c控制台程序,使用动态库,内容:
#include <STDIO.H>
#pragma comment(lib,"../lib/Cdll.lib")//函数地址文件
//.dll文件要放在与程序同一文件夹中
int main()
{
int sum=Cdll_add(34,56);
printf("34+56=%d\n",sum);
return 0;
}
C++中使用演示样例:
//CPPdll项目中:
//CPPdll.cpp
_declspec(dllexport) int CPPdll_add(int a,int b)
{
return a+b;
}
//CPPdll.def
LIBRARY CPPdll
EXPORTS
CPPdll_add @1
编译生成dll和lib,
新建測试项目调用CPPdll和Cdll
#include<STDIO.H>
#pragma comment(lib,"../lib/CPPdll.lib")//C++调用c++的动态库
#pragma comment(lib,"../lib/Cdll.lib")//c++调用c的动态库
extern "C" _declspec(dllexport) int Cdll_add(int a,int b);
_declspec(dllexport) int CPPdll_add(int a,int b);
int main()
{
int sum=CPPdll_add(23,45);
printf("23+45=%d\n",sum);
int sum2=Cdll_add(231,45);
printf("231+45=%d\n",sum2);
return 0;
}
附:显示调用CPPdll
#include <STDIO.H>
#include <WINDOWS.H>
//动态库加.def 文件申明函数地址
typedef int(*DLL_ADD)(int a,int b);//函数类型
int main()
{
HINSTANCE dll= LoadLibrary("CPPdll.dll");//载入动态库
DLL_ADD add=(DLL_ADD)GetProcAddress(dll,"CPPdll_add");
int sum=add(23,45);
printf("23+45=%d\n",sum);
FreeLibrary(dll);
return 0;
}
动态库中的类定义:
//dllclass.h文件,能够公开给调用方
#ifndef DLLCLASS_H
#define DLLCLASS_H
#ifdef DLLCLASS_EXPORTS //在动态库.cpp中要定义,来表示导出
#define EXT_CLASS _declspec(dllexport) //cpp文件使用。导出
#else
#define EXT_CLASS _declspec(dllimport) //别人调用,导入
#endif
class EXT_CLASS CMath
{
public:
int add(int a,int b);
};
#endif
//dllclass.cpp文件
#define DLLCLASS_EXPORTS
#include <WINDOWS.H>
#include <STDIO.H>
#include "dllclass.h"
//动态库入口函数,返回false则表示调用不成功
BOOL CALLBACK DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpReserved)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH://进程载入,初始化
{
printf("loading dll ……\n");
}
break;
case DLL_PROCESS_DETACH://进程卸载。清理资源
{
printf("unloading dll ……\n");
}
break;
}
return true;
}
int CMath::add(int a,int b)
{
return a+b;
}
//调用
#include "../dllclass/dllclass.h"//包括类声明文件
#pragma comment(lib,"../lib/dllclass.lib") //包括静态库文件
int main()
{
CMath math;
int sum3=math.add(3,4);
cout<<"3+4 结果是:"<<sum3<<endl;
return 0;
}
C++windows内核编程笔记day11 win32静态库和动态库的使用的更多相关文章
- C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用
//设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...
- c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理
windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...
- C++windows内核编程笔记day13 进程、线程与信号量
Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- Windows静态库和动态库的创建和使用
偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...
- Windows静态库和动态库的创建和使用(VS2005)
偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...
- Windows下静态库与动态库的创建与使用
Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...
- Windows下静态库、动态库的创建和调用过程
静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...
- C++ 静态库与动态库以及在 Windows上 的创建、使用
一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...
随机推荐
- mysql插入数据出现java.lang.NullPointerException
在写购物车持久层的时候,要进行测试的时候居然出现了空指针异常: 最后发现是测试类少了 @RunWith(SpringRunner.class)@SpringBootTest 如下是没改之前的测试类: ...
- 关于Scrapy爬虫项目运行和调试的小技巧(下篇)
前几天给大家分享了关于Scrapy爬虫项目运行和调试的小技巧上篇,没来得及上车的小伙伴可以戳超链接看一下.今天小编继续沿着上篇的思路往下延伸,给大家分享更为实用的Scrapy项目调试技巧. 三.设置网 ...
- 1044 - Access denied for user 'root'@'%' to database 'xahy-blog'
grant 创建了一个远程连接 root 权限账户, 准备再授权个对应数据库操作的账户时出现了 1044 错误. [SQL]grant all privileges on xahy-blog.* to ...
- luogu P1592 互质(欧拉函数)
题意 (n<=106,k<=108) 题解 一开始以为是搜索. 但想想不对,翻了一眼题解发现是欧拉函数. 因为 gcd(a,b)=gcd(a,a+b) 所以和n互质的数应该是类似a1,a2 ...
- vi 学习记录
i 光标所在前插入 I 光标所在行的第一个非空字符前进入输入模式 a 光标所在后插入 A 光标所在最后插入 o 光标所在列下新增一列并进入输入模式 O 光标所在列上新增一列并进入输入模式 退出 :q, ...
- 笔记本win2008 r2的hyper-v安装centos
一.i5以上cpu支持虚拟化,不过默认是关闭的,先到bios设置里把虚拟功能打开: 二.“服务器管理器”->“角色”里安装hyper-v并重启: 三.设置无线网络桥接,有线就不需要了,具体如下: ...
- ORACLE数据库字符集处理
简介: ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储.处理和检索数据.利用全球化支持,OR ...
- POJ——T3352 Road Construction
http://poj.org/problem?id=3352 vis表示访问的次序 low的值相同的点在同一连通分量 #include <algorithm> #include <c ...
- 最多包含2/k个不同字符的最长串
看这里的解答: http://www.cnblogs.com/grandyang/p/5351347.html 通用解决了2和k的问题.
- 11g v$wait_chains 与 hanganalyze
11g之后,通过v$wait_chains视图诊断数据库hang和Contention 11g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后 ...