动态链接库DLL使用学习笔记

来源:互联网 发布:579999小马哥永久域名 编辑:程序博客网 时间:2024/06/02 06:40

使用C#或其他语言时经常会引用到DLL,分享一些学习笔记。
DLL(Dynamic Linkable Library),提供一些可以拿来用的变量,函数或类。 静态与动态链接库都是共享代码的方式,如果采用静态链接库,则无论愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是如果使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”引用和卸载这个与EXE独立的DLL文件。

1、DLL的编制与具体的编程语言及编译器无关
只要遵守约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用,像JAVA,C#调用C++编写的DLL。
在windows下的system32文件夹中可以看到许多.dll windows的大多数API都包含在这些DLL。像MessageBox函数就包含在user32.dll这个动态链接库中.

2、静态库编译
在VS下创建一个win32控制台应用程序,选择静态库,添加C++类,添加代码,完成后右击文件属性页,选择常规-输出目录-….\lib,选择平台工具集xp(保证兼容性)-编译,此时在lib文件夹中会生成文件。
在新的想要引用静态库的程序中,添加以上添加好代码的头文件.h,-右键进入属性页-选择C/C++-附加包含目录-(输入静态库头文件的目录)-链接器-常规-附加库目录….\lib-链接器-输入-附加依赖项-添加刚生成的.lib。

除了以上方法设置路径使用静态库,还可以在主程序中,添加头文件

#pragma comment(lib,"xxx.lib")//xxx代表需要引用的静态库

这样做的话就要把设置路径中的文件删除,防止多重定义。

3、DLL动态链接库编译
在VS下创建一个win32控制台应用程序,选择DLL(可以勾选导出符号,简便),看见新生成的dll.cpp等,dllmain.cpp作为自己用的动态库,可以不用过多关注,如果是多个程序的入口,则需要关注进程线程函数处理。添加代码,完成后右击文件属性页,选择常规-输出目录-….\dll,右键解决方案-属性-项目依赖项-选择主程序依赖于DLL。
右键主程序属性-链接器-常规-附加库目录-…..
常规-输出目录-….\bin;平台工具集xp;dll属性页-链接器-高级-导入库把
$(OutDir)改为..\..\lib;

#pragma comment(lib,"xxx.lib")//xxx代表需要引用的静态库

使用.lib编译,程序不灵活,跨语言不方便,在函数前加extern “C”可以使函数不重载,告诉编译器是C语言,名字不会改动。这样的话把引用的头文件,库文件,引用函数都删掉。
加以下代码:
#include<windows.h>;
typedef int(*DLLFUN)(void);生成一个函数指针

并在主函数main中加

HMODULE hdll = LoadLibrary(L"xx.dll");if(!hdll){return -1;}DLLFUN fun = GetProcAddress(hdll,"fndll");fun();FreeLibrary(hdll);//释放动态链接库

这种方法比较灵活,在很多项目都有用到,使扩展代码变得非常容易。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 玉米糁窝窝头的做法 玉米糁图片 玉米糁的功效与作用 玉米糁减肥 玉米糁饼 玉米糁饼的做法 临沂舰 临沂话 山东话 临沂宾馆沂蒙路店 临沂路 临沧市区酒店 云南省临沧市双江县 临沧市人力资源和社会保障网 临沧市客运站 临沭县中医医院 临沭县宾馆 临沭县事业编 临沭一中 临沭找工作吧 临沭房产信息网 临沭人才网 临沭招聘网 巴彦淖尔临河区宾馆 巴彦淖尔临河区酒店 临河市医院 临河火车站时刻表 临河火车站附近足浴店 长春临河街饭店 老妈菜馆临河街店 临河二手房 临泉县 临泉县属于哪个市 临泉县邮编 临泉县人口 安徽省临泉县 临泉县人民医院 安徽省临泉县邮政编码 安徽临泉县 临泉招聘网 安徽省阜阳市临泉县邮政编码