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上 的创建、使用
一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...
随机推荐
- const char *初值赋值以及文件读取
#include<iostream> #include<fstream> #include<string> #include<cstring> usin ...
- php对excel导入导出的支持
闲话不多说了,大家直接进入主题 php对excel的导入: 1.为程序添加一个form表单,为form标签添加“enctype="multipart/form-data"”属性 ...
- 被我忽略许久的set
心塞,set一直是我忽略的一个数据结构 1.生成一个set: 1) set(iterable) 传入一个可以迭代的数据结构: eg:字符串;元组;列表,字典 2) {v1,v2,.......,vn} ...
- POJ——T2117 Electricity
http://poj.org/problem?id=2117 Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5459 ...
- [MST] Create an Entry Form to Add Models to the State Tree
It is time to add new entries to the wishlist. We will achieve this by reusing forms and models we'v ...
- new 对象和Class的getInstance()方法的差别?
创建对象时的差别 1.new 对象包含2步, 1)载入类: 2)而且实例化. 2.Class的对象.getInstance(),只不过实例化. 也就是说.在运行 Class的对象.getInstanc ...
- 开源 java CMS - FreeCMS2.3会员个人资料
原文地址:http://javaz.cn/site/javaz/site_study/info/2015/28577.html 项目地址:http://www.freeteam.cn/ 个人资料 从 ...
- 关于有的Apk无法反编译的探究
Android的apk包,其实就是zip包,只不过后缀名换了而已!使用“好压”等解压缩工具解压,就可以看到里面的内容了.简单介绍一下吧. 以下就是解压出来的apk的内容: 其中: assets ...
- 基于分布式的短文本命题实体识别之----人名识别(python实现)
目前对中文分词精度影响最大的主要是两方面:未登录词的识别和歧义切分. 据统计:未登录词中中文姓人名在文本中一般只占2%左右,但这其中高达50%以上的人名会产生切分错误.在所有的分词错误中,与人名有关的 ...
- 集合 List和Set
分别向Set集合以及List集合中添加“A”,“a”,“c”,“C”,“a”5个元素,观察重复值“a”能否在List集合以及Set集合中成功添加. List<String> ls=new ...