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静态库和动态库的使用的更多相关文章

  1. C++windows内核编程笔记day09_day10,对话框和窗体基本控件等的使用

    //设置字体颜色 SetTextColor(hdc,RGB(255,0,0)); //窗体背景 //wce.hbrBackground=(HBRUSH)(COLOR_WINDOW+1); //wce. ...

  2. c++windows内核编程笔记day12 硬盘逻辑分区管理、文件管理、内存管理

    windows系统磁盘文件存储: 分区格式:NTFS / FAT32 GetSystemDirectory();//获取系统路径 GetWindowsDirectory();//获取windows路径 ...

  3. C++windows内核编程笔记day13 进程、线程与信号量

    Windows进程 进程是一个容器,包括程序运行须要的代码.数据.资源等信息, windows进程的特点: 每一个进程都有自己的ID号 每一个进程都有自己的地址空间.进程之间无法訪问对方的地址空间. ...

  4. storysnail的Windows串口编程笔记

    storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...

  5. Windows静态库和动态库的创建和使用

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

  6. Windows静态库和动态库的创建和使用(VS2005)

    偶们在实际的编程开发中,经常会遇到运行时无法找到某个DLL文件或者链接时无法找到某个LIB文件.然后,我们就开始乱GOOGLE一下,然后将VS2005的设置改变一下,或许就Ok了,我们将别人开发的DL ...

  7. Windows下静态库与动态库的创建与使用

    Windows下静态库与动态库的创建与使用 学习内容:本博客介绍了Windows下使用Visual C++ 6.0制作与使用静态库与动态库的方法. --------CONTENTS-------- 一 ...

  8. Windows下静态库、动态库的创建和调用过程

    静态库和动态库的使用包括两个方面,1是使用已有的库(调用过程),2是编写一个库供别人使用(创建过程).这里不讲述过多的原理,只说明如何编写,以及不正确编写时会遇见的问题. //注:本文先从简单到复杂, ...

  9. C++ 静态库与动态库以及在 Windows上 的创建、使用

    一.什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常. 本质上来说库是一种可执行代码的二进制形式,可以 ...

随机推荐

  1. 企业微信H5支付返回不到自己指定的结果页面

    项目:vue做的H5项目,嵌入到企业微信里 发现的问题:支付完成后的跳转页面 跳转不到自己指定的页面 问题在于:调支付接口时,redirectUrl: document.location.protoc ...

  2. NOIp模拟赛二十九

    又是受虐的一天呢~接下来四天都要打模拟赛QAQ 今日分数:0(100)+100+0=100 A题O(读入)结论题判断结果时没return 0被subtask卡成0分,喜提fstQAQ,B题DP,C题不 ...

  3. LightOJ-1336 Sigma Function 唯一分解定理 巧妙使用sqrt()等算数目

    题目链接:https://cn.vjudge.net/problem/LightOJ-1336 题意 给出一个区间[1, n],求区间内所有数中因数之和为偶数的数目 思路 第二次写这个题 首先想到唯一 ...

  4. react添加右键点击事件

    1.在HTML里面支持contextmenu事件(右键事件).所以需要在组建加载完时添加此事件,销毁组建时移除此事件. 2. 需要增加一个state,名称为visible,用来控制菜单是否显示.在_h ...

  5. 【BZOJ 1588】 [HNOI2002]营业额统计

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 每天的最小波动值指的是和之前所有天的差值的绝对值中的最小值. 用set.的lower_bound函数. 每次找和他差值最小的数字就好 ...

  6. CI框架源代码阅读笔记2 一切的入口 index.php

    上一节(CI框架源代码阅读笔记1 - 环境准备.基本术语和框架流程)中,我们提到了CI框架的基本流程.这里再次贴出流程图.以备參考: 作为CI框架的入口文件.源代码阅读,自然由此開始. 在源代码阅读的 ...

  7. hadoop-07-ntp服务检查

    hadoop-07-ntp服务检查 cd /etc/more /etc/ntp.conf里面进行了server的配置 service ntpd status / stop/ start 安装ntpd ...

  8. Dubbo分布式服务框架入门(附project)

    要想了解Dubbo是什么,我们不防先了解它有什么用. 使用场景:比方我想开发一个网上商城项目.这个网上商城呢,比較复杂.分为pc端web管理后台.微信端销售公众号,那么我们分成四个项目,pc端站点,微 ...

  9. 4、java变量、函数、基本类型的值传递、分支、循环、流程控制

    一.全局变量(global).局部变量(local).动态变量(dynamic).静态变量(static) 在类中的变量为全局变量,在方法函数中为局部变量,局部变量必须有人为赋的初值,全局变量的初值是 ...

  10. 汇编中中括号[]作用以及lea和mov指令的区别

    现在总结一下:其中牵扯到lea指令,mov指令,[] 一.lea指令:对于寄存器来说:第二个操作数是寄存器必须要加[],不然报错,这里lea就是取[寄存器]的值,如:mov eax,2lea ebx, ...