在线咨询
微博
网吧论坛
游戏告警
网吧特权
全站搜索
APP下载
开网吧
开网咖
注册
网吧转让
网吧供求
关注微信
网吧联盟论坛
网吧系统
┊
网吧经营
┊
网吧无盘
网吧计费
┊
网吧心声
┊
网咖天下
网吧论坛
┊
网吧专题
┊
网吧游戏
首 页
网吧网咖
天下网咖
网吧无盘
网吧技术
网吧经营
电竞酒店
网吧方案
网吧路由
系统开号
推荐大家使用天下网吧小程序
办理Steam特权,网吧加速器,开号服务
网吧无盘系统开号
网吧管理
网吧政策
网吧经营
网吧热点
网吧配机
网吧装修
网吧转让
网吧观点
网吧系统
技术论坛
网吧系统
无盘技术
软件技术
硬件技术
网络技术
网吧路由
网吧安全
网吧故障
网吧计费
技术论坛
无盘教程
无盘优化
无盘工具
无盘配机
无盘故障
无盘论坛
VLAN方案
无线方案
方案实例
方案分析
装修方案
游戏管理
整体方案
无盘方案
软件方案
网络方案
网吧政策
网吧经营
网吧展示
网吧装修
网吧配机
产品评测
产品导购
最新动态
配机展示
网咖桌椅
网咖经营
电竞网咖
网咖VR
网咖水吧
网咖转型
网咖配机
网咖动态
网咖微信营销
网咖欣赏
路由教程
路由下载
路由脚本
路由经验
路由施工
路由工具
路由论坛
宁夏
浙江
贵州
其它省市
四川
电竞酒店网络
电竞酒店装修
行业动态
电竞酒店管理
电竞酒店系统
推荐网吧
网吧黄页
网吧装修
环境设施
网吧电脑
网吧软件
系统桌面
国外网吧
您现在的位置:
天下网吧
>>
网吧天地
>>
天下码农
>>
微信小程序
>> 正文
浅解DLL
2011-2-10
vczx
佚名
【
大
中
小
】
前言
动态链接库(DLL)很重要,这不用说了,自从微软推出16位操作系统,以后每个版本的操作系统都非常依赖于DLL中的函数。实际上,windows操作系统中几乎所有的内容都由DLL以一种形式或另外一种形式代表着。比如:显示字体或图标存储在GDI DLL中,显示windows桌面和处理用户输入存储在User DLL中,windows编程所需的大量API函数存储在Kernal DLL中等等。
DLL的优点
为什么要这么广泛的使用DLL,就是因为它有很多优点。
最主要的一个优点是使用较少的资源,因为多个应用程序甚至是不同语言编写的应用程序都可以共享同一个DLL,这样就减少了代码在硬盘上和物理内存上的重复存放。
另外,DLL有助于促进模块式程序的开发。因为它的封装性、独立性好。
还有就是简化安装和升级。因为在软件升级的时候,开发人员只需修改DLL文件就可以了,如果DLL导出函数的接口没有变。而且程序代码也不需要重新编译,这大大提高了软件开发和维护的效率。
什么是DLL
DLL是一个包含可由多个程序同时使用的代码和数据的库,MSDN上是这样说的。DLL实际上是建立在客户/服务器通信的概念上的,包含很多个函数、类或资源的库文件。函数和数据被存储在一个DLL上,并由一个或多个客户导出使用,这些客户可以是应用程序,也可以是DLL。DLL与静态库不同,静态库情况下,函数和数据被编译成一个二进制文件(通常是.LIB文件),编译器在编译程序代码时,将这些函数和数据恢复出来并和程序的其它模块一起编译成可执行文件.exe,这个过程就是“静态链接”。在这个过程中,因为程序所需的函数和数据都是从库中复制过来的,所以在程序发行的时候,静态库不需要与可执行文件一起发行。
动态库就不同了,它有两个文件,一个是引入库文件(.LIB),一个是DLL文件。引入库文件中包含着导出函数的名字和地址,而实际的函数和数据是在DLL文件中的。所以我们会看见.LIB文件通常要比.DLL文件小的多。应用程序就是通过.LIB文件链接到所需要的DLL文件的,这时,DLL中的函数和数据并不复制到可执行文件中,所以在可执行中存放的不是被调用函数的代码,而是链接到此函数的地址,所以,.LIB文件和.DLL文件必须随可执行文件一起发行,否则会出错。
加载DLL的两种方式
在应用程序加载DLL时,有两种方式来调用DLL导出函数,加载时动态链接和运行时动态链接。加载时动态链接就是说应用程序可以像调用本地函数一样对DLL导出的函数进行显示调用。但在这种方式中,我们必须提供.h和.LIB文件,以保证加载时正确解析导出函数的位置。运行时动态链接中,应用程序可以运行时用LoadLibrary和LoadLibraryEx函数来完成对DLL的加载。加载成功以后,用GetProcAddress函数获得DLL导出函数的地址,当我们使用完导出函授时,要调用FreeLibrary函数来释放加载的DLL。这种方式中,不需要提供.LIB文件。
那么什么时候用加载时动态链接,什么时候使用运行时动态链接呢?这要看你的应用程序的需要。如果你的应用程序很注重初始启动时的性能,则使用运行时动态链接比较好。如果是为了图方便,可以像调用本地函数一样调用DLL导出的函数,可以考虑使用加载时动态链接。如果想在应用程序中实现分支,并根据不同需要加载不同的模块,比如开发多语言版本的程序,就要使用运行时动态链接了。
使用DLL
首先要导出DLL函数,我们可以向导出DLL函数中添加关键字,也可以创建模块定义文件(.def)来列出DLL导出函数。对于要导出的每一个函数,我们都需要使用关键字对其声明:
__declspec(dllexport)
在应用程序中要想使用这些导出函数,也需要使用关键字来声明要使用的DLL导出函数:
__declspec(dllimport)
我们还可以使用模块定义文件来声明DLL导出函数,这样,我们就不需要向DLL导出函数中添加关键字了。如:
//
myDLL.def
//
LIBRARY
"
myDLL
"
EXPORTS
HelloWorld
示例DLL和应用程序
这是一个在Visual C++中用“Win32动态链接库”项目类型创建的示例程序。
//
myDLL.cpp
//
#include
"
stdafx.h
"
#define
EXPORTING_DLL
#include
"
sampleDLL.h
"
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return
TRUE;
}
void
HelloWorld()
{
MessageBox( NULL, TEXT(
"
Hello World
"
), TEXT(
"
In a DLL
"
), MB_OK);
}
//
File: myDLL.h
//
#ifndef INDLL_H
#define
INDLL_H
#ifdef EXPORTING_DLL
extern
__declspec(dllexport)
void
HelloWorld() ;
#else
extern
__declspec(dllimport)
void
HelloWorld() ;
#endif
#endif
下面的程序是一个win32应用程序,该程序调用myDLL中的导出函数HelloWorld。
//
myApp.cpp
//
#include
"
stdafx.h
"
#include
"
myDLL.h
"
int
APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int
nCmdShow)
{
HelloWorld();
return
0
;
}
注意:在加载时动态链接中,必须链接在生成myDLL项目时创建的myDLL.lib引入库。
在运行时动态链接中,应该这样调用myDLL.dll中的导出函数:
...
typedef VOID (
*
DLLPROC) (LPTSTR);
...
HINSTANCE hinstDLL;
DLLPROC HelloWorld;
BOOL fFreeDLL;
hinstDLL
=
LoadLibrary(
"
myDLL.dll
"
);
if
(hinstDLL
!=
NULL)
{
HelloWorld
=
(DLLPROC) GetProcAddress(hinstDLL,
"
HelloWorld
"
);
if
(HelloWorld
!=
NULL)
(HelloWorld);
fFreeDLL
=
FreeLibrary(hinstDLL);
}
...
这只是个简单的例子,但大致的使用方法就是这样。
欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛
https://bbs.txwb.com
关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩
本文来源:
vczx
作者:佚名
上一篇文章:
泛型:volatile——多线程程序员最好的朋友volatile修正符及让你的编译器为你检查竞态条件(race cond
下一篇文章:
如何在C#中使用全局鼠标、键盘Hook
相关文章
win7系统出现rundll错误不要急,教你一招
Win10环境Opencl.dll无法修复怎么办
Win7提示找不到Msvcp50.dll怎么办
网吧win7系统玩游戏缺少vcomp100.dll文件解决
网吧电脑玩游戏提示丢失d3dx9_43.dll怎么办
win7运行游戏提示mxvcp120.dll丢失
win7电脑提示缺少xlive.dll文件怎么办
Win7系统提示丢失msvcp71.dll文件?
看看谷歌猴年的Doodle啥样子
Kindle宣布将要更新系统
推荐专题 ┊
更多专题..
网吧卫生
网吧电脑配置
开网吧
网吧键盘
网吧配置
网吧GHOST
ROS
网吧软件故障解决
网众无盘
网吧游戏菜单
网吧活动
网吧优化
网吧精品
网吧新手
声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:
1175525021
本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下
推荐文章
网吧语音呼叫哪款好用?体验简约
免费绿色简单的网吧语音呼叫系统,天下网吧会员的经典作品,功能强大,使用简单,上手
解决网吧Steam登陆慢的批处理源码
本批处理是解决Steam登陆慢的问题专门编写。原理是修改hosts文件让相关域……
网吧语音呼叫哪款好用?体验简约绿
解决网吧Steam登陆慢的批处理源码
疫情当下,网吧自救讨论之二:租电
疫情下网吧转让增多,疫情期间接手
洛阳网吧求助信,疫情下的网吧行业
网吧做好系统安全,防盗号三要三不
网吧和电竞酒店使用的系统教程和下
网吧千兆低成本升级方案:2.5G到桌
网吧员工服务态度怎么抓上去,我网
关于WIN10下网吧客户端中文输入法与
最新文章
又是一家疫情期间违规营业的网吧
之前天下网吧注意到相关的新闻并发布了预警内容提醒各位疫情期间请按相关规定操作。……
部分网吧英雄联盟卡顿现象持续,
自从3-31日英雄联盟停机更新维护以来,不少网吧在天下网吧上反映卡顿的问题。天……
又是一家疫情期间违规营业的网吧:负责
部分网吧英雄联盟卡顿现象持续,官方称
2022-04-02日网吧游戏更新信息,敬请关注
web端看图神器viewer.js,修复移动端触
网吧Steam每次启动都提示更新,查找日志
网吧疫情停业的网吧自救方案,有人已经
「韬光养晦」二十多年,Intel发力PC端独
设置网吧Steam节点到ChongQing,实现游
2022-04-01日网吧游戏更新信息,敬请关注
macOS Monterey 12.3.1值得升级吗?MBP
本周热门
本月热门
阅读排行
网吧疫情停业的网吧自救方案,有人
网吧语音呼叫哪款好用?体验简约绿
解决网吧Steam登陆慢的批处理源码
又是一家疫情期间违规营业的网吧:
部分网吧英雄联盟卡顿现象持续,官
2022-04-02日网吧游戏更新信息,敬请
web端看图神器viewer.js,修复移动
网吧Steam每次启动都提示更新,查找
LOL酒桶打野E闪 雷柏VT30电竞
雷柏VH650耳机推荐听大片—八佰
网吧和电竞酒店使用的系统教程和下
最近网吧老被盗号,分享一款工具可
英雄联盟进不去,卡「重新连接」界
带120台以上的大型网吧/电竞酒店游
网吧的英雄联盟掉帧、卡顿,CF卡顿
2022年网咖最常玩的游戏是啥?来看
最近显卡降价了,2060快降到发行价
杨天祥与他的网吧故事——网吧行业
2022年网吧可以用电子身份证了吗?
开网吧一天能赚多少钱的数据分析
网吧员工服务态度怎么抓上去,我网
网吧千兆低成本升级方案:2.5G到桌
网吧和电竞酒店使用的系统教程和下
最近网吧老被盗号,分享一款工具可
英雄联盟进不去,卡「重新连接」界
2022年开网吧服务器电脑配置方案三
自从干了网吧,成了人下人了,见谁
从23个习惯中可以看出你是不是老网
带120台以上的大型网吧/电竞酒店游
网吧的英雄联盟掉帧、卡顿,CF卡顿
正在加载..