动态链接库技术及其应用实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
新 DLL 是一种磁盘文件。它由全局数据、服务函数和资
源组成。
在某些情况下, 我们在做程序时可能想隐藏例程 实现的一些细节, 动态链接库就是一项非常不错的实 现方法。动态链接库的例程可以被应用程序访问, 而 不显示其中的代码细节。还有很重要的一点就是 DLL 与语言的无关性。例如 DELPHI 的编译单元 DCU 可以 隐藏细节, 但是 DCU 只适用于 Delphi 程序, 而且还常 常受到版本的限制。正是由于 DLL 与语言无关, 所以
(2)显式的调用 是 指 在 应 用 程 序 中 用 LoadLibrary 或 MFC 提 供 的 AfxLoadLibrary 显式的将自己所做的动态链接库调 进来, 动态链接库的文件名即是上面两个函数的参 数 , 再 用 GetProcAddress() 获 取 想 要 引 入 的 函 数 。 自 此, 你就可以象使用如同本应用程序自定义的函数一 样来调用此引入函数了。在应用程序退出之前, 应该 用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动 态链接库。直接调用 Win32 的 LoadLibary 函数, 并指 定 DLL 的 路 径 作 为 参 数 。 LoadLibary 返 回 HIN- STANCE 参数, 应用程序在调用 GetProcAddress 函数 时使用这一参数。GetProcAddress 函数将符号名或标
左的压栈方式, LPSTR 表示函数 CardID()函数的返 回
类型。这样一个 DLL 文件框架就可以构成了。
(5)函数具体实现
①在 CardID 函数中定义变量
NCB StatNCB;
UCHAR uRetCode;
char* idStr=NULL; //函数返回值
LANA_ENUM aEnum; //lana_num 为网 卡 编 号 ,
⑶"MFC Extension DLL ( Using shared MFC DLL) : 用来实现从 MFC 所继承下来的类的重新利用, 也就 是说, 如果用这种类型的动态链接库, 可以用来输出 一个从 MFC 所继承下来的类。它输出的函数仅可以 被使用 MFC 且动态链接到 MFC 的应用程序使用。可
针, 在退出之前必须卸载 DLL(FreeLibrary)。
5.动 态 链 接 库 文 件 创 建 调 用 举 例 , 利 用 动 态 链 接
库文件获取网卡 mac 地址。
(1)用 VC++6.0 的 AppWizard,选 择 AppWizard(dll)
创建新项目 IDdll, 这里 选择 “Regular DLL with MFC
Key wor ds:VC++,Dynamic Link Libr ar y (DLL),MAC addr ess
技
1 动态链接库基本概念
术 动 态 链 接 库 DLL(Dynamic Link Library)是 一 个 可
创 以被其它应用程序共享的程序模块, 其中封装了一些 可以被共享的例程和资源, 其连接方式是动态的。
体实例。
关键词:VC++ 动态链接库(DLL) 网卡地址( mac)
中 图 分 类 号 : T P 311
文献标识码:A
Abstr act:This paper discuss Dynamic Link Library technology and its application in VC++. And give an specific implement of get- ting the computer ' s MAC address.
当 应 用 程 序 运 行 过 程 中 需 要 加 载 DLL 文 件 时 , Windows 根据这些信息发现并 加载 DLL, 然后通 过符 号名或标识号实现对 DLL 函数的动态连接。所有被应 用程序调用的 DLL 文 件 都 会 在 应 用 程 序 EXE 文 件 加载时被加载在到内存中。可执行程序链接到一个包 含 DLL 输出函数信息的输入库文件(.LIB 文件)。操作 系统在加载使用可执行程序时加载 DLL。可执行程序 直接通过函数名调用 DLL 的输出函数, 调用方法和程 序内部其它的函数是一样的。
⑵有助于模块式化体系结构开发 动态链接库有助于促进模块式程序的开发, 支持 多 语 言 程 序 。这 样 可 以 帮 助 我 们 开 发 要 求 提 供 多 个 语 言版本的大型程序或要求具有模块式体系结构的程 序。对于一个大型的系统, 如果用一个执行文件完成, 程序将会很庞大, 而且还可能有许多重复的功能。如 果将程序分成一系列的主程序和 DLL, 可 以减少开发 的工作量和提高开发的速度。 ⑶修改升级软件方便 当动态链接库中的函数需要更新或修复时, 部署 和安装动态链接库不要求 重新建立程 序与该 DLL 的 连接。此外, 如果多个程序使用同一个 DLL, 那么多个 程序都将从该更新或修复中获益。当您使用定期更新 或修复的第三 方 DLL 时, 此问题 可能会更频 繁地出 现, 升级到 DLL 更为容易解决这些问题。 ⑷隐藏实现细节
port)是 一 个 修 改 符 。它 将 某 些 附 加 信 息 嵌 入 产 生 的.obj
文件中。当连接 DLL 的所有.obj 文件时, 连接程序将
对这些信息进行分析。_stdcall 是 Pascal 程序的缺 省
调 用 方 式 , 通 常 用 于 Win32 API 中 , 函 数 采 用 从 右 到
(南京工业大学)王 敏 邵 定 宏 陆 金 桂
Wang ,Min S hao ,DingHong Lu ,J inGui
ቤተ መጻሕፍቲ ባይዱ
摘要:本 文 探 讨 了 动 态 链 接 库 ( DLL) 文 件 的 相 关 知 识 以 及 在 VC++ 中 的 使 用 方 法 , 并 给 出 了 一 个 实 现 机 器 网 卡 地 址 获 取 的 具
王敏:硕士研究生
这 里 介 绍 一 下 , Visual studio 6.0 下 创 建 的 方 法 , 在 VC 6.0 中的 MFC 可以支持三种形式的 DLL, 包括 常规静态动态链接库文件、常规动态 链接库文件和 扩 展动态链接库文件。
⑴Regular DLL with MFC statically linked: 指的是 不用 MFC 的类库结构, 直接用 C 或者 C++ 语言写的 DLL, 其 输 出 的 函 数 一 般 用 的 是 标 准 C 或 者 C++ 接 口, 并能被 非 MFC 或 MFC 编写的应用程序所调用。
一个可用网卡的信息
《P LC 技术应用 200 例》
邮局订阅号: 82-946 360 元 / 年 - 273 -
statically linked”类型并按下 Finish 按钮。
(2)Project- >Setting- >Link 下, 然 后 在 下 面 的 Ob-
ject/Library modules 中输入你连接的 lib 文件 netapi32.
lib, 并在头文件中加入 #include <nb30.h>。因为是通
当 应 用 程 序 运 行 过 程 中 需 要 加 载 DLL 文 件 时 , Windows 根据这些信息发现并 加载 DLL, 然后通 过符 号名或标识号实现对 DLL 函数的动态连接。所有被应 用程序调用的 DLL 文 件 都 会 在 应 用 程 序 EXE 文 件 加载时被加载在到内存中。可执行程序连接到一个包 含 DLL 输出函数信息的输入库文件(.LIB 文件)。操作 系统在加载使用可执行程序时加载 DLL。可执行程序 直接通过函数名调用 DLL 的输出函数, 调用方法和程 序内部其 它的函数是一样的。
软件时空 文章编号:1008- 0570(2006)09- 3- 0272- 03
中 文 核 心 期 刊 《 微 计 算 机 信 息 》( 管 控 一 体 化 )2006 年 第 22 卷 第 9-3 期
动态链接库技术及其应用实例
Dyn a m ic Lin k Lib ra ry te ch n o lo g y a n d a p p lica tio n
过 NetAPI 来获取网卡信息。所以需要包含其题头文件
nb30.h。
(3) 添加一个如下的一个结构 体用来存储 存放返
回网卡信息的变量 typedef struct _ASTAT_
技
{
术
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff;
创
}ASTAT, * PASTAT;
4 动态链接库文件的调用
在 VC 中, 动态链接库的调用方式有两种: 隐式调 用方式和显示调用方式。
⑴隐式的调用 需要把产生动 态链接库时 产生的 .LIB 文件 加入到应 用程序的工程中, 在我们正确建立一个动态链接库文 件时, 连接程序会自动生成一个与之对应的 .LIB 导入 文件。该文件包含了每一个 DLL 导出函数的符号名和 可选的标识号, 但是并不含有实际的代码。LIB 文件作 为 DLL 的替代文件被编译到应用程序项目中。
识号转换为 DLL 内部的地址。可以决定 DLL 文件何
时加载或不加载, 显式连接在运行时决定加载哪个
DLL 文 件 。 使 用 DLL 的 程 序 在 使 用 之 前 必 须 加 载
( LoadLibrary) 加载 DLL 从而得到一个 DLL 模块的句
柄, 然后调用 GetProcAddress 函 数得到输出 函数的指
一般地, 从 0 开始
②关键代码描述
memset(&StatNCB,0,sizeof(StatNCB)); //初 始 化
NCB
strcpy((char*)StatNCB.ncb_callname,"*");
StatNCB.ncb_command=NCBASTAT; //设 命 令
为获
StatNCB.ncb_lana_num=AdapterIndex; //设要取第
新 (4)添 加 全 局 函 数 extern "C" __declspec(dllexport)
LPSTR __stdcall CardID(), 此 函 数 为 我 们 动 态 链 接 库
文件的接口函数。如前面所述, extern "C"表示产生的
DLL 文 件 可 以 被 C 语 言 程 序 调 用 。 __declspec(dllex-
⑵Regular DLL using shared MFC DLL: 是用 MFC 类库编写的。明显的特点是在源文件里有一个继承 CWinApp 的类。该类 DLL 应用程序里头的输出函数 可以被任意 Win32 程序使用。输入函数有如下形式: extern "C" EXPORT YourFunction()。DLL 应用程序从 CwinApp 派生, 但没有消息循环。
2 动态链接库的优点
⑴运行时占用较少的硬件资源 当多个程序使用同一个函数库时, 动态链接库的
用 VC++创建 DLL, 可以被其它任何支持动态链接库 的编程语言调用, 如 VB、Delphi、PD 等。
3 动态链接库文件的创建
使用可以减少在磁盘和物理内存中加载的代码的重复 量。在运行时, 只有当有 EXE 程序确实要调用该 DLL 模块的情况下, 系统才会将它们装载到内存空间中。
- 272 - 360元 / 年 邮局订阅号: 82-946
《现场总线技术应用 200 例》
您的论文得到两院院士关注
软件时空
以从 MFC 继承所想要的、更适于自己用的类, 并把它 提 供 给 相 对 应 的 应 用 程 序 中 。你 也 可 随 意 的 给 你 的 应 用 程 序 提 供 MFC 或 MFC 继 承 类 的 对 象 指 针 。 Ex- tension DLL 是 使 用 MFC 的 动 态 链 接 版 本 来 创 建 的 , 并 且 它 只 能 被 用 作 MFC 类 库 所 编 写 的 应 用 程 序 调 用。Extension DLLs 和 Regular DLLs 不一样, 它没有从 CWinApp 继 承 而 来 的 类 的 对 象 , 因 此 , 你 必 须 为 DLLMain 函数添加初始化代码和结束代码。
源组成。
在某些情况下, 我们在做程序时可能想隐藏例程 实现的一些细节, 动态链接库就是一项非常不错的实 现方法。动态链接库的例程可以被应用程序访问, 而 不显示其中的代码细节。还有很重要的一点就是 DLL 与语言的无关性。例如 DELPHI 的编译单元 DCU 可以 隐藏细节, 但是 DCU 只适用于 Delphi 程序, 而且还常 常受到版本的限制。正是由于 DLL 与语言无关, 所以
(2)显式的调用 是 指 在 应 用 程 序 中 用 LoadLibrary 或 MFC 提 供 的 AfxLoadLibrary 显式的将自己所做的动态链接库调 进来, 动态链接库的文件名即是上面两个函数的参 数 , 再 用 GetProcAddress() 获 取 想 要 引 入 的 函 数 。 自 此, 你就可以象使用如同本应用程序自定义的函数一 样来调用此引入函数了。在应用程序退出之前, 应该 用 FreeLibrary 或 MFC 提供的 AfxFreeLibrary 释放动 态链接库。直接调用 Win32 的 LoadLibary 函数, 并指 定 DLL 的 路 径 作 为 参 数 。 LoadLibary 返 回 HIN- STANCE 参数, 应用程序在调用 GetProcAddress 函数 时使用这一参数。GetProcAddress 函数将符号名或标
左的压栈方式, LPSTR 表示函数 CardID()函数的返 回
类型。这样一个 DLL 文件框架就可以构成了。
(5)函数具体实现
①在 CardID 函数中定义变量
NCB StatNCB;
UCHAR uRetCode;
char* idStr=NULL; //函数返回值
LANA_ENUM aEnum; //lana_num 为网 卡 编 号 ,
⑶"MFC Extension DLL ( Using shared MFC DLL) : 用来实现从 MFC 所继承下来的类的重新利用, 也就 是说, 如果用这种类型的动态链接库, 可以用来输出 一个从 MFC 所继承下来的类。它输出的函数仅可以 被使用 MFC 且动态链接到 MFC 的应用程序使用。可
针, 在退出之前必须卸载 DLL(FreeLibrary)。
5.动 态 链 接 库 文 件 创 建 调 用 举 例 , 利 用 动 态 链 接
库文件获取网卡 mac 地址。
(1)用 VC++6.0 的 AppWizard,选 择 AppWizard(dll)
创建新项目 IDdll, 这里 选择 “Regular DLL with MFC
Key wor ds:VC++,Dynamic Link Libr ar y (DLL),MAC addr ess
技
1 动态链接库基本概念
术 动 态 链 接 库 DLL(Dynamic Link Library)是 一 个 可
创 以被其它应用程序共享的程序模块, 其中封装了一些 可以被共享的例程和资源, 其连接方式是动态的。
体实例。
关键词:VC++ 动态链接库(DLL) 网卡地址( mac)
中 图 分 类 号 : T P 311
文献标识码:A
Abstr act:This paper discuss Dynamic Link Library technology and its application in VC++. And give an specific implement of get- ting the computer ' s MAC address.
当 应 用 程 序 运 行 过 程 中 需 要 加 载 DLL 文 件 时 , Windows 根据这些信息发现并 加载 DLL, 然后通 过符 号名或标识号实现对 DLL 函数的动态连接。所有被应 用程序调用的 DLL 文 件 都 会 在 应 用 程 序 EXE 文 件 加载时被加载在到内存中。可执行程序链接到一个包 含 DLL 输出函数信息的输入库文件(.LIB 文件)。操作 系统在加载使用可执行程序时加载 DLL。可执行程序 直接通过函数名调用 DLL 的输出函数, 调用方法和程 序内部其它的函数是一样的。
⑵有助于模块式化体系结构开发 动态链接库有助于促进模块式程序的开发, 支持 多 语 言 程 序 。这 样 可 以 帮 助 我 们 开 发 要 求 提 供 多 个 语 言版本的大型程序或要求具有模块式体系结构的程 序。对于一个大型的系统, 如果用一个执行文件完成, 程序将会很庞大, 而且还可能有许多重复的功能。如 果将程序分成一系列的主程序和 DLL, 可 以减少开发 的工作量和提高开发的速度。 ⑶修改升级软件方便 当动态链接库中的函数需要更新或修复时, 部署 和安装动态链接库不要求 重新建立程 序与该 DLL 的 连接。此外, 如果多个程序使用同一个 DLL, 那么多个 程序都将从该更新或修复中获益。当您使用定期更新 或修复的第三 方 DLL 时, 此问题 可能会更频 繁地出 现, 升级到 DLL 更为容易解决这些问题。 ⑷隐藏实现细节
port)是 一 个 修 改 符 。它 将 某 些 附 加 信 息 嵌 入 产 生 的.obj
文件中。当连接 DLL 的所有.obj 文件时, 连接程序将
对这些信息进行分析。_stdcall 是 Pascal 程序的缺 省
调 用 方 式 , 通 常 用 于 Win32 API 中 , 函 数 采 用 从 右 到
(南京工业大学)王 敏 邵 定 宏 陆 金 桂
Wang ,Min S hao ,DingHong Lu ,J inGui
ቤተ መጻሕፍቲ ባይዱ
摘要:本 文 探 讨 了 动 态 链 接 库 ( DLL) 文 件 的 相 关 知 识 以 及 在 VC++ 中 的 使 用 方 法 , 并 给 出 了 一 个 实 现 机 器 网 卡 地 址 获 取 的 具
王敏:硕士研究生
这 里 介 绍 一 下 , Visual studio 6.0 下 创 建 的 方 法 , 在 VC 6.0 中的 MFC 可以支持三种形式的 DLL, 包括 常规静态动态链接库文件、常规动态 链接库文件和 扩 展动态链接库文件。
⑴Regular DLL with MFC statically linked: 指的是 不用 MFC 的类库结构, 直接用 C 或者 C++ 语言写的 DLL, 其 输 出 的 函 数 一 般 用 的 是 标 准 C 或 者 C++ 接 口, 并能被 非 MFC 或 MFC 编写的应用程序所调用。
一个可用网卡的信息
《P LC 技术应用 200 例》
邮局订阅号: 82-946 360 元 / 年 - 273 -
statically linked”类型并按下 Finish 按钮。
(2)Project- >Setting- >Link 下, 然 后 在 下 面 的 Ob-
ject/Library modules 中输入你连接的 lib 文件 netapi32.
lib, 并在头文件中加入 #include <nb30.h>。因为是通
当 应 用 程 序 运 行 过 程 中 需 要 加 载 DLL 文 件 时 , Windows 根据这些信息发现并 加载 DLL, 然后通 过符 号名或标识号实现对 DLL 函数的动态连接。所有被应 用程序调用的 DLL 文 件 都 会 在 应 用 程 序 EXE 文 件 加载时被加载在到内存中。可执行程序连接到一个包 含 DLL 输出函数信息的输入库文件(.LIB 文件)。操作 系统在加载使用可执行程序时加载 DLL。可执行程序 直接通过函数名调用 DLL 的输出函数, 调用方法和程 序内部其 它的函数是一样的。
软件时空 文章编号:1008- 0570(2006)09- 3- 0272- 03
中 文 核 心 期 刊 《 微 计 算 机 信 息 》( 管 控 一 体 化 )2006 年 第 22 卷 第 9-3 期
动态链接库技术及其应用实例
Dyn a m ic Lin k Lib ra ry te ch n o lo g y a n d a p p lica tio n
过 NetAPI 来获取网卡信息。所以需要包含其题头文件
nb30.h。
(3) 添加一个如下的一个结构 体用来存储 存放返
回网卡信息的变量 typedef struct _ASTAT_
技
{
术
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff;
创
}ASTAT, * PASTAT;
4 动态链接库文件的调用
在 VC 中, 动态链接库的调用方式有两种: 隐式调 用方式和显示调用方式。
⑴隐式的调用 需要把产生动 态链接库时 产生的 .LIB 文件 加入到应 用程序的工程中, 在我们正确建立一个动态链接库文 件时, 连接程序会自动生成一个与之对应的 .LIB 导入 文件。该文件包含了每一个 DLL 导出函数的符号名和 可选的标识号, 但是并不含有实际的代码。LIB 文件作 为 DLL 的替代文件被编译到应用程序项目中。
识号转换为 DLL 内部的地址。可以决定 DLL 文件何
时加载或不加载, 显式连接在运行时决定加载哪个
DLL 文 件 。 使 用 DLL 的 程 序 在 使 用 之 前 必 须 加 载
( LoadLibrary) 加载 DLL 从而得到一个 DLL 模块的句
柄, 然后调用 GetProcAddress 函 数得到输出 函数的指
一般地, 从 0 开始
②关键代码描述
memset(&StatNCB,0,sizeof(StatNCB)); //初 始 化
NCB
strcpy((char*)StatNCB.ncb_callname,"*");
StatNCB.ncb_command=NCBASTAT; //设 命 令
为获
StatNCB.ncb_lana_num=AdapterIndex; //设要取第
新 (4)添 加 全 局 函 数 extern "C" __declspec(dllexport)
LPSTR __stdcall CardID(), 此 函 数 为 我 们 动 态 链 接 库
文件的接口函数。如前面所述, extern "C"表示产生的
DLL 文 件 可 以 被 C 语 言 程 序 调 用 。 __declspec(dllex-
⑵Regular DLL using shared MFC DLL: 是用 MFC 类库编写的。明显的特点是在源文件里有一个继承 CWinApp 的类。该类 DLL 应用程序里头的输出函数 可以被任意 Win32 程序使用。输入函数有如下形式: extern "C" EXPORT YourFunction()。DLL 应用程序从 CwinApp 派生, 但没有消息循环。
2 动态链接库的优点
⑴运行时占用较少的硬件资源 当多个程序使用同一个函数库时, 动态链接库的
用 VC++创建 DLL, 可以被其它任何支持动态链接库 的编程语言调用, 如 VB、Delphi、PD 等。
3 动态链接库文件的创建
使用可以减少在磁盘和物理内存中加载的代码的重复 量。在运行时, 只有当有 EXE 程序确实要调用该 DLL 模块的情况下, 系统才会将它们装载到内存空间中。
- 272 - 360元 / 年 邮局订阅号: 82-946
《现场总线技术应用 200 例》
您的论文得到两院院士关注
软件时空
以从 MFC 继承所想要的、更适于自己用的类, 并把它 提 供 给 相 对 应 的 应 用 程 序 中 。你 也 可 随 意 的 给 你 的 应 用 程 序 提 供 MFC 或 MFC 继 承 类 的 对 象 指 针 。 Ex- tension DLL 是 使 用 MFC 的 动 态 链 接 版 本 来 创 建 的 , 并 且 它 只 能 被 用 作 MFC 类 库 所 编 写 的 应 用 程 序 调 用。Extension DLLs 和 Regular DLLs 不一样, 它没有从 CWinApp 继 承 而 来 的 类 的 对 象 , 因 此 , 你 必 须 为 DLLMain 函数添加初始化代码和结束代码。