DLL 编写规则msvcr100.dll是什么么

应用程序编程接口 _百度百科
特色百科用户权威合作手机百科
收藏 查看&应用程序编程接口本词条缺少信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
API之主要目的是提供应用与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。
A reference implementation of an API is the implementation created by the designer of the API, or one which other implementations of the API are expected to be compared against.
例如,图形库中的一组API定义调用绘制图标函数的方式,以于上显示图标。程序中调用,编译时连接到这组API,执行时便调用API的实现(库)来显示图标。
操作系统的API可用来分配内存或访问文件。许多系统与应用程序提供API接口与实现,比如,数据库,网络,Web服务,甚至于某些游戏。
一组API经常是一套(SDK)的一部分。SDK亦可包含其它工具亦或至于硬件,两个术语并不完全等同.
API有诸多不同设计。用于快速执行的接口通常包括函数,,与数据结构。也有其它方式,如通过,或是提供抽象层以遮蔽同API实现相关的信息,确保使用API的代码无需更改而适应实现变化。
API 就是应用程序编程接口。它是能用来操作组件、应用程序或者操作系统的一组函数。典型的情况下,API 由一个或多个提供某种特殊功能的 DLL 组成。
DLL 是一个文件,其中包含了在 Microsoft& Windows& 下运行的任何应用程序都可调用的函数。运行时,DLL 中的函数动态地链接到调用它的应用程序中。无论有多少应用程序调用 DLL 中的某个函数,在上只有一个文件包含该函数,且只在它调入内存时才创建该 DLL。
您听到最多的 API 可能是 Windows API,它包括构成 Windows 操作系统的各种 DLL。每个 Windows 应用程序都直接或间接地与 Windows API 互动。Windows API 保证 Windows 下运行的所有应用程序的行为方式一致。随着 Windows 操作系统的发展,现已发布了几个版本的 Windows API。Windows 3.1 使用 Win16 API。Microsoft& Windows NT&、Windows 95 和 Windows 98 平台使用 Microsoft& Win32& API。
除 Windows API 外,其他一些 API 也已发布。例如,邮件应用程序编程接口 (MAPI) 是一组可用于编写电子邮件应用程序的 DLL。
API 传统上是为开发 Windows 应用程序的 C 和 C++ 程序员编写的,但其他的(包括VBA)也可以调用 DLL 中的函数。因为大部分 DLL 主要是为 C 和 C++ 程序员编写和整理说明的,所以调用 DLL 函数的方法与调用 VBA 函数会有所不同。在使用 API 时必须了解如何给 DLL 函数传递参数。
警告 调用 Windows API 和 其他 DLL 函数可能会给您的应用程序带来不良影响。从自己的代码中直接调用 DLL 函数时,您绕过了 VBA 通常提供的一些安全机制。如果在定义或调用 DLL 函数时出现错误(所有程序员都不可避免),可能会在应用程序中引起应用程序错误(也称为通用性保护错误,或 GPF)。最好的解决办法是在运行代码以前保存该项目,并确保了解 DLL 的原理。
新手上路我有疑问投诉建议参考资料 查看查看: 2103|回复: 9
最后登录在线时间0 小时机票85 大叔币0 注册时间阅读权限10主题精华0积分169UID845384
玩机一段, 积分 169, 距离下一级还需 81 积分
机票85 大叔币0 最后登录注册时间主题精华0UID845384
本帖最后由 sunying9988 于
23:52 编辑
我的IMEI码因为刷机掉了,请教两个问题:
一是IMEI码我记得P780有两个,且两个不一样,电池上只找到一个,另一个怎么找?
二是SN_Write_tool_exe写入IMEI码的方法有人在P780上成功过么,我是没成功,不知道是不是我win7的64位系统原因,显示刷 search new com port fail
移动叔叔论坛 - 论坛版权
1、发帖作者在本主题帖中的所有言论和图片纯属个人意见,与立场无关
2、发帖作者在本站发表的所有标注为原创的主题帖,其相关版权归发帖作者和所有
3、其他单位或个人若进行使用、转载或引用本文时,需同时征得该发帖作者和的同意
4、发帖作者必须承担一切因本文的发表而直接或者间接导致的民事或刑事法律责任
5、本主题帖的部分内容可能来源于网络,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请提供有效证明材料联系本站,本站将及时删除并致以最深的歉意
7、管理员和版主有权不事先通知随时删除本文
最后登录在线时间589 小时机票371 大叔币1000 注册时间阅读权限200主题精华20积分63574UID46842
联系邮箱 lee-
机票371 大叔币1000 最后登录注册时间主题精华20UID46842
淡定,淡定,淡定……
最后登录在线时间18 小时机票810 大叔币0 注册时间阅读权限100主题精华10积分1611UID255569
机票810 大叔币0 最后登录注册时间主题精华10UID255569
试了N次 终于在偶尔重启电脑后成功了一次,没敢再试……
最后登录在线时间0 小时机票496 大叔币0 注册时间阅读权限30主题精华0积分1548UID743964
玩机三段, 积分 1548, 距离下一级还需 452 积分
机票496 大叔币0 最后登录注册时间主题精华0UID743964
不敢试,会把手机 的IMEI&&刷消失,,&&
最后登录在线时间0 小时机票448 大叔币0 注册时间阅读权限20主题精华0积分835UID91582
玩机二段, 积分 835, 距离下一级还需 65 积分
机票448 大叔币0 最后登录注册时间主题精华0UID91582
只要驱动装对,写多少次都没有问题,
切记:在第一处的下拉菜单中选择write IMEI + Backup Nvram(WM/Andriod Only)
注意:此处若选择write IMEI,可以写入串码,但在卡刷或下次线刷时依旧会丢掉,这里是最应该注意的,许多教程会误导大家。
最后登录在线时间0 小时机票85 大叔币0 注册时间阅读权限10主题精华0积分169UID845384
玩机一段, 积分 169, 距离下一级还需 81 积分
机票85 大叔币0 最后登录注册时间主题精华0UID845384
关外游侠 发表于
只要驱动装对,写多少次都没有问题,
切记:在第一处的下拉菜单中选择write IMEI + Backup Nvram(WM/Andriod&&...
我特别看了你的教程,确实是按你的方法操作的,可是问题是无法连接,发现不了USB数据口,这该怎么办,我用win7和xp都试了,就是不行,愁死人
最后登录在线时间0 小时机票448 大叔币0 注册时间阅读权限20主题精华0积分835UID91582
玩机二段, 积分 835, 距离下一级还需 65 积分
机票448 大叔币0 最后登录注册时间主题精华0UID91582
驱动没有装好,
最后登录在线时间0 小时机票85 大叔币0 注册时间阅读权限10主题精华0积分169UID845384
玩机一段, 积分 169, 距离下一级还需 81 积分
机票85 大叔币0 最后登录注册时间主题精华0UID845384
关外游侠 发表于
驱动没有装好,
我用两台机器都试过了,装驱动就是到驱动目录里面找是吧
最后登录在线时间0 小时机票4 大叔币0 注册时间阅读权限1主题精华0积分9UID1280885
新注册用户, 积分 9, 距离下一级还需 41 积分
机票4 大叔币0 最后登录注册时间主题精华0UID1280885
我写入成功,你要线刷一个官方包,然后使用官方包所带的a和m的数据库,写入就可以了。当然驱动要先装好。
最后登录在线时间0 小时机票53 大叔币0 注册时间阅读权限10主题精华0积分91UID1249354
玩机小白, 积分 91, 距离下一级还需 29 积分
机票53 大叔币0 最后登录注册时间主题精华0UID1249354
好不好用?
【联想P770 VIP勋章 】发评测即可申请
【联想P780 VIP勋章】发评测即可申请
移动叔叔. 版权所有,专业的网络售后平台 (
商务合作||||windows下dll编程学习笔记
1、&DLL的概念
DLL(Dynamic Linkable
Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。
静态链接库与动态链接库的区别:
(1)&静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
(2)&静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
动态链接库的分类:Visual C++支持三种DLL,它们分别是Non-MFC
DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension
DLL(MFC扩展DLL)。非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL
包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
2、&创建一个DLL
2.1 非MFC的DLL
2.1.1声明导出函数:
extern “C” __declspec(dllexport) int add(int a, int b);
其中 extern
“C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。这样如果用C编译的程序来调用该dll中的函数时,可能会造成找不到该函数。
__declspec(dllexport)表示该函数为DLL输出函数,即其他应用程序可以调用该函数
从dll中声明输出函数有两种方式:
(1)&另外一种方式是采用模块定义(.def)
文件声明,.def文件为链接器提供了有关被链接程序的导出、属性及其他方面的信息。
(2)&用__declspec(dllexport)来声明函数
如果使用Visual
C++来创建dll,对于同样用VC创建的exe来说,调用dll没有什么问题。而如果用其他工具来创建的exe来调用dll,就会出现问题。因为即使你不用C++编译器,Microsoft
C编译器也会损害C函数。当用__stdcall将函数输出时,C编译器会将函数改为的形式。在这里需要在.def文件中加入EXPORTS节来输出函数:
这样,dll将用func函数名来输出函数。
另一种方式是用#pragma (linker,
“/exports:func=_func@1”),告诉编译器输出函数func,这种方式没有前一种好。
如果通过VC++编写的DLL欲被其他语言编写的程序调用,应将函数的调用方式声明为__stdcall方式,WINAPI都采用这种方式,而C/C++缺省的调用方式却为__cdecl。__stdcall方式与__cdecl对函数名最终生成符号的方式不同。若采用C编译方式(在C++中需将函数声明为extern
"C"),__stdcall调用约定在输出函数名前面加下划线,后面加“@”符号和参数的字节数,形如;而__cdecl调用约定仅在输出函数名前面加下划线,形如_functionname。
; lib.def : 导出DLL函数
LIBRARY dllTest
.def文件的规则为:
  (1)LIBRARY语句说明.def文件相应的DLL;
  (2)EXPORTS语句后列出要导出函数的名称。可以在.def文件中的导出函数名后加@n,表示要导出函数的序号为n(在进行函数调用时,这个序号将发挥其作用);
  (3).def 文件中的注释由每个注释行开始处的分号 (;)
指定,且注释不能与语句共享一行。
  由此可以看出,例子中lib.def文件的含义为生成名为“dllTest”的动态链接库,导出其中的add函数,并指定add函数的序号为1。
Dll的调用方式:&&&
DLL的调用分为两种方式:动态和静态
(1)&动态调用:typedef int(*lpAddFun)(int, int);
//宏定义函数指针类型
&&&&&&&&&&&&&&&&
lpAddF//函数指针
HINSTANCE hDll=LoadLibrary(“path”);
&&&&&&&&&&&&&&&
add=(lpAddFun)GetProcAddress(hDll,
"add");//获得dll中的add函数指针
&&&&&&&&&&&&&&&&
FreeLibrary(hDll);
在从dll调用中返回的函数、指针或者类都是以指针的方式会的,即返回的是函数、变量或类的地址。这里一定要注意,不能简单的用函数名来赋值。
(2)&静态调用:将生成的.dll和.lib文件拷入到调用dll的工程中,用命令
&& #pragma
comment(lib,"dllTest.lib"),实现静态调用,即把该dll在编译的时候也编译到exe文件中去,而后在工程中调用时用下面的代码:
#pragma comment(lib,"dllTest.lib")
//.lib文件中仅仅是关于其对应DLL文件中函数的重定位信息
extern "C" __declspec(dllimport) add(int x,int y);
int main(int argc, char* argv[])
int result = add(2,3);
printf("%d",result);
  由上述代码可以看出,静态调用方式的顺利进行需要完成两个动作:
  (1)告诉编译器与DLL相对应的.lib文件所在的路径及文件名,#pragma
comment(lib,"dllTest.lib")就是起这个作用。
  程序员在建立一个DLL文件时,连接器会自动为其生成一个对应的.lib文件,该文件包含了DLL
导出函数的符号名及序号(并不含有实际的代码)。在应用程序里,.lib文件将作为DLL的替代文件参与编译。
另外一种显式调用的方式是设置vc中的目录和includefiles来实现
  (2)声明导入函数,extern "C" __declspec(dllimport) add(int x,int
y)语句中的__declspec(dllimport)发挥这个作用。
  静态调用方式不再需要使用系统API来加载、卸载DLL以及获取DLL中导出函数的地址。这是因为,当程序员通过静态链接方式编译生成应用程序时,应用程序中调用的与.lib文件中导出符号相匹配的函数符号将进入到生成的EXE
文件中,.lib文件中所包含的与之对应的DLL文件的文件名也被编译器存储在
EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows将根据这些信息发现并加载DLL,然后通过符号名实现对DLL
函数的动态链接。这样,EXE将能直接通过函数名调用DLL的输出函数,就象调用程序内部的其他函数一样。
2.1.3 DllMain函数
Windows在加载dll的时候,会首先需要一个入口函数DllMain。当在dll中不定义DllMain的时候,windows会从其他运行库中调用一个不做任何操作的DllMain函数,直接返回true。DllMain是dll内部的函数,这意味着在调用dll的程序中不能显式的调用。它是在dll被调用时自动被调用的。
BOOL& APIENTRY DllMain( HANDLE hModule, DWORD
ul_reason_for_call,
LPVOID lpReserved)
switch (ul_reason_for_call)
case: DLL_PROCESS_ATTACH:
case: DLL_THREAD_ATTACH:
case: DLL_THREAD_DETACH:
case: DLL_PROCESS_DETACH:
return TRUE;
在dll中导出变量
1、在dll中定义变量
2、在.def中定义输出 EXPORTS:
&&&&&&&&&&&&&&&&&&&
global& DATA
3、&在应用程序中调用:#pragma
comment(lib,"dllTest.lib")
注意在此引入的变量global,是一个地址,在使用时需要强制转化为指针后再用,才能得到其值。
(int *)global=10;
在应用工程中引用DLL中全局变量的一个更好方法是:
extern int _declspec(dllimport)
//用_declspec(dllimport)导入
通过_declspec(dllimport)方式导入的就是DLL中全局变量本身而不再是其地址了,建议在一切可能的情况下使用这种方式。
2.3 dll导出类
&& 在定义的时候用 class
_declspec(dllexport) classname{
在类中引用的时候用
加入类定义头文件:#include “classname.h”
Class _declspec(dllimport) classname 来导入类
3、&MFC规则Dll
MFC规则DLL的概念体现在两方面:
  (1) 它是MFC的
  “是MFC的”意味着可以在这种DLL的内部使用MFC;
  (2) 它是规则的
  “是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。
  Regular
DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。
(1)静态链接到MFC 的规则DLL
  静态链接到MFC的规则DLL与MFC库(包括MFC扩展
DLL)静态链接,将MFC库的代码直接生成在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC
的规则DLL中不需要进行模块状态的切换。
  使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
(2)动态链接到MFC 的规则DLL
  动态链接到MFC 的规则DLL 可以和使用它的可执行文件同时动态链接到
MFC DLL 和任何MFC扩展
DLL。在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。因此,对于共享MFC
DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模板。
&& 我们可以在Visual
C++中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC
DLL。如图8,依次选择Visual C++的project -& Settings -&
General菜单或选项,在Microsoft Foundation Classes中进行设置。
3.1规则DLL的创建;
与非MFCdll不同的是,在其定义里面可以引入MFC类,其他与非MFC一样
3.2规则DLL的调用
(1)显示方式LoadLibrary , GetProcAdress , FreeLibrary
我们照样可以在EXE程序中隐式调用MFC规则DLL,只需要将DLL工程生成的.lib文件和.dll文件拷入当前工程所在的目录,并在RegularDllCallDlg.cpp文件(图12所示对话框类的实现文件)的顶部添加:
#pragma comment(lib,"RegularDll.lib")
3.3共享MFC
DLL的规则DLL的模块切换
应用程序进程本身及其调用的每个DLL模块都具有一个全局唯一的HINSTANCE句柄,它们代表了DLL或EXE模块在进程虚拟空间中的起始地址。进程本身的模块句柄一般为0x400000,而DLL模块的缺省句柄为0x。如果程序同时加载了多个DLL,则每个DLL模块都会有不同的HINSTANCE。应用程序在加载DLL时对其进行了重定位。
  共享MFC
DLL(或MFC扩展DLL)的规则DLL涉及到HINSTANCE句柄问题,HINSTANCE句柄对于加载资源特别重要。EXE和DLL都有其自己的资源,而且这些资源的ID可能重复,应用程序需要通过资源模块的切换来找到正确的资源。如果应用程序需要来自于DLL的资源,就应将资源模块句柄指定为DLL的模块句柄;如果需要EXE文件中包含的资源,就应将资源模块句柄指定为EXE的模块句柄。
模块的切换有三种方式:
(1)在DLL函数中调用:AFX_MANAGE_STATE(AfxGetStaticModuleState());(推荐使用,最简单)
void ShowDlg(void)
//方法1:在函数开始处变更,在函数结束时恢复
//将AFX_MANAGE_STATE(AfxGetStaticModuleState());作为接口函数的第一//条语句进行模块状态切换
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CDialog dlg(IDD_DLL_DIALOG);//打开ID为2000的对话框
dlg.DoModal();
(2)在DLL函数中调用AfxGetResourceHandle();
AfxSetResourceHandle(HINSTANCE xxx);
(3)由应用程序自身切换(不推荐,最麻烦)
4、扩展MFCDLL
MFC扩展DLL的内涵为MFC的扩展,用户使用MFC扩展DLL就像使用MFC本身的DLL一样。除了可以在MFC扩展DLL的内部使用MFC以外,MFC扩展DLL与应用程序的接口部分也可以是MFC。我们一般使用MFC扩展DLL来包含一些MFC的增强功能,譬如扩展MFC的CStatic、CButton等类使之具备更强大的能力。
导出一个类,直接在类声明头文件中使用AFX_EXT_CLASS即可,最后别忘了在调用dll的程序中加入class的头文件
综上所述:以上几种dll主要由以下几种区别:
1、动态链接库是将exe程序在程序执行的时候动态加载的,而静态链接库是在编译的时&
将其编译在代码之中的
2、动态链接库可以输出变量、函数和类。其中每种输出的方式与调用方式不尽相同:
(1)变量:在dll中定义
&&&&&&在.def文件中输出
&&&&&&&&&&&&&&&&&&&&&&
global DATA
或extern _declspec(dllexport)int global(不用输出文件了)
在程序中调用:
静态调用:&& #pragma
comment(lib,"dllTest.lib")
extern int _declspec(dllimport)
(2)函数:在dll中定义
extern “C” __declspec(dllexport) int add(int a, int
也可以在.def文件中输出该函数
在程序中调用:
静态调用:
&#pragma comment(lib,"dllTest.lib")
extern "C" __declspec(dllimport) add(int x,int y);
动态调用:
&& typedef
int(*lpAddFun)(int, int); //宏定义函数指针类型
&&&&&&&&&&&&&&&&
lpAddF//函数指针
&& HINSTANCE
hDll=LoadLibrary(“path”);
&&&&&&&&&&&&&&&
add=(lpAddFun)GetProcAddress(hDll,
"add");//获得dll中的add函数指针
&&&&&&&&&&&&&&&&
FreeLibrary(hDll);
在从dll调用中返回的函数、指针或者类都是以指针的方式会的,即返回的是函数、变量或类的地址。这里一定要注意,不能简单的用函数名来赋值。
(3)类:在dll中定义:
&在定义的时候用 class _declspec(dllexport)
classname{
在类中引用的时候用
加入类定义头文件:#include “classname.h”
Class _declspec(dllimport) classname 来导入类
3、除了扩展MFC的dll外,其他的dll均可被其他语言编写的应用程序来调用。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。文章 - 2&评论 - 0&trackbacks - 0
&&&&& 大家都知道,在WINDOWS系统中有很多的动态链接库(以.DLL为后缀
的文件,DLL即Dynamic Link Library)。这种动态链接库,和静态函数库不
同,它里面的函数并不是执行程序本身的一部分,而是根据执行程序需要
按需装入,同时其执行代码可在多个执行程序间共享,节省了空间,提高
了效率,具备很高的灵活性,得到越来越多程序员和用户的青睐。那么,
在LINUX系统中有无这样的函数库呢?
答案是肯定的,LINUX的动态链接库不仅有,而且为数不少。在/lib目录下
,就有许多以.so作后缀的文件,这就是LINUX系统应用的动态链接库,只
不过与WINDOWS叫法不同,它叫so,即Shared Object,共享对象。(在
LINUX下,静态函数库是以.a作后缀的) X-WINDOW作为LINUX下的标准图
形窗口界面,它本身就采用了很多的动态链接库(在/usr/X11R6/lib目录下),
以方便程序间的共享,节省占用空间。著名的APACHE网页服务器,也采
用了动态链接库,以便扩充程序功能。你只需将PHP动态链接库拷到其共
享目录,修改一下配置,APACHE就可以支持PHP网页了。如果你愿意,
可以自己编写动态链接库,让APACHE支持你自己定义的网页格式。这就
是动态链接的好处。
1、LINUX下动态链接库的创建
&&&&&& 在LINUX系统下,创建动态链接库是件再简单不过的事情。只要在编译
函数库源程序时加上-shared选项即可,这样所生成的执行程序即为动态链
接库。从某种意义上来说,动态链接库也是一种执行程序。按一般规则,
程序名应带.so后缀。下面举个例子说说。
我准备编写两个函数,一个用于查询当前日期getdate,一个用于查询当前
时间gettime,并将这两个函数存于动态链接库my.so中。为此,需要做以
下几项工作。
1.1 编写用户接口文件datetime.h,内容如下(每行前面的数字为行号):
----------------------------------------------------------------------
1 /* datetime.h : 纵横软件制作中心雨亦奇编写, . */
3 #ifndef __DATETIME_H
5 #define __DATETIME_H
7 /* 日期结构 */
8 typedef struct
13 }DATETYPE;
15 /* 时间结构 */
16 typedef struct
21 }TIMETYPE;
23 /* 函数原型说明 */
25 #ifdef SHARED
26 int (*getdate)(DATETYPE *d);
28 int getdate(DATETYPE *d);
31 #ifdef SHARED
32 int (*gettime)(TIMETYPE *t);
34 int gettime(TIMETYPE *t);
----------------------------------------------------------------------
这个用户接口文件中,先定义了日期与时间结构,接着定义一下函数的原
型。动态函数与静态函数的原型说明不同的是,动态函数应使用(*函数名)的
形式,以便引用其指针。若要引用文件中的动态函数说明,用户应该定义一
下SHARED宏,这样才能使用。
1.2 编写getdate.c,源程序如下:
----------------------------------------------------------------------
1 /* getdate.c : 纵横软件制作中心雨亦奇编写, . */
3 #i nclude "time.h"
4 #i nclude "datetime.h"
6 int getdate(DATETYPE *d)
9 struct tm *
11 time(&ti);
12 tm=localtime(&ti);
13 d-&year=tm-&tm_year+1900;
14 d-&mon=tm-&tm_mon+1;
15 d-&day=tm-&tm_
----------------------------------------------------------------------
在getdate函数中,先调用time取得以秒计的系统时间,再用localtime函数
转换一下时间结构,最后调整得到正确的日期。
1.3 编写gettime.c,源程序如下:
----------------------------------------------------------------------
1 /* gettime.c : 纵横软件制作中心雨亦奇编写, . */
3 #i nclude "time.h"
4 #i nclude "datetime.h"
6 int gettime(TIMETYPE *t)
9 struct tm *
11 time(&ti);
12 tm=localtime(&ti);
13 t-&hour=tm-&tm_
14 t-&min=tm-&tm_
15 t-&sec=tm-&tm_
----------------------------------------------------------------------
gettime函数与getdate函数相仿,先用time函数取得以秒计的系统时间,再
用localtime函数转换一下时间结构,最后返回当前的时间(不需调整)。
1.4 编写维护文件makefile-lib,内容如下:
----------------------------------------------------------------------
1 # makefile-lib : 纵横软件制作中心雨亦奇编写, .
3 all : my.so
5 SRC = getdate.c gettime.c
7 TGT = $(SRC:.c=.o)
9 $(SRC) : datetime.h
10 @touch $@
12 %.o : %.c
13 cc -c $?
15 # 动态函数库(my.so)生成
16 my.so : $(TGT)
17 cc -shared -o $@ $(TGT)
----------------------------------------------------------------------
编写维护文件的目的,在于方便程序员维护程序,尤其是维护比较大的工
程项目。一个素质良好的程序员应该学会熟练地编写维护文件makefile。定
义了文件间的依赖关系后,一旦源文件发生变化,仅需make一下,其目标
文件维护代码会自动执行,从而自动更新目标文件,减少了许多工作量。
注意: 每行维护代码必须以TAB(跳格键)开始,不是的话make时将出错。
本维护文件第1行是注释行,以#号开头;文件第3行定义所有需要维护的
函数库;第5行定义相关源程序文件;第7行定义目标文件;第9-10行说明
所有源程序依赖于datetime.h头文件,并有相应维护代码,即touch一下,
更新一下源文件的时间;第12-13行定义.o文件依赖于相应的.c文件,并指
定了维护代码,即用cc编译一下;第16-17行定义共享库my.so依赖的目标
文件,维护代码中用-shared编译选项,以生成动态链接库my.so。
1.5 运行make -f makefile-lib 命令
make运行后,动态链接库my.so就产生了,我们就可以在程序中调用了。
如果想让系统所有用户都可以使用,则应以root用户登录系统,将这个库
拷贝到/lib目录下(命令:cp my.so /lib),或者在/lib目录下建个符号连接即可
(命令:ln -s `pwd`/my.so /lib)。
2、LINUX下动态链接库的使用
2.1 重要的dlfcn.h头文件
LINUX下使用动态链接库,源程序需要包含dlfcn.h头文件,此文件定义了调
用动态链接库的函数的原型。下面详细说明一下这些函数。
2.1.1 dlerror
原型为: const char *dlerror(void);
当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为
NULL时表示操作函数执行成功。
2.1.2 dlopen
原型为: void *dlopen (const char *filename, int flag);
dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。
filename: 如果名字不以/开头,则非绝对路径名,将按下列先后顺序查找该
(1) 用户环境变量中的LD_LIBRARY值;
(2) 动态链接缓冲文件/etc/ld.so.cache
(3) 目录/lib,/usr/lib
flag表示在什么时候解决未定义的符号(调用)。取值有两个:
1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。
2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解
决,dlopen将返回错误。
dlopen调用失败时,将返回NULL值,否则返回的是操作句柄。
2.1.3 dlsym : 取函数执行地址
原型为: void *dlsym(void *handle, char *symbol);
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函
数的执行代码地址。由此地址,可以带参数执行相应的函数。
如程序代码: void (*add)(int x,int y); /* 说明一下要调用的动态函数add */
add=dlsym("xxx.so","add"); /* 打开xxx.so共享库,取add函数地址 */
add(89,369); /* 带两个参数89和369调用add函数 */
2.1.4 dlclose : 关闭动态链接库
原型为: int dlclose (void *handle);
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数
为0时,才会真正被系统卸载。
2.2 在程序中使用动态链接库函数
2.2.1 程序范例
下面的程序装载了动态链接库my.so,并用getdate,gettime取得当前日期与
时间后输出。
----------------------------------------------------------------------
1 /************************************/
2 /* 文件名称: dy.c */
3 /* 功能描述: 动态链接库应用示范程序 */
4 /* 程序编写: 纵横软件制作中心雨亦奇 */
5 /* 编写时间:
6 /************************************/
8 #i nclude "stdio.h" /* 包含标准输入输出文件 */
10 #i nclude "dlfcn.h" /* 包含动态链接功能接口文件 */
11 #define SOFILE "./my.so" /* 指定动态链接库名称 */
13 #define SHARED /* 定义宏,确认共享,以便引用动态函数 */
14 #i nclude "datetime.h" /* 包含用户接口文件 */
18 DATETYPE
19 TIMETYPE
23 puts("动态链接库应用示范");
25 dp=dlopen(SOFILE,RTLD_LAZY); /* 打开动态链接库 */
27 if (dp==NULL) /* 若打开失败则退出 */
29 fputs(dlerror(),stderr);
30 exit(1);
33 getdate=dlsym(dp,"getdate"); /* 定位取日期函数 */
35 error=dlerror(); /* 检测错误 */
36 if (error) /* 若出错则退出 */
38 fputs(error,stderr);
39 exit(1);
42 getdate(&d); /* 调用此共享函数 */
43 printf("当前日期: %04d-%02d-%02d\n",d.year,d.mon,d.day);
45 gettime=dlsym(dp,"gettime"); /* 定位取时间函数 */
47 error=dlerror(); /* 检测错误 */
48 if (error) /* 若出错则退出 */
50 fputs(error,stderr);
51 exit(1);
54 gettime(&t); /* 调用此共享函数 */
55 printf("当前时间: %02d:%02d:%02d\n",t.hour,t.min,t.sec);
57 dlclose(dp); /* 关闭共享库 */
59 exit(0); /* 成功返回 */
----------------------------------------------------------------------
第8行: 包含标准输入输出头文件,因为程序中使用了printf,puts,fputs等标准
输入输出函数,需要让编译器根据头文件中函数的原型,检查一下语法;
第10-11行: 包含动态链接库功能头文件,并定义动态链接库名称;
第13-14行: 定义宏SHARED以便引用14行的头文件datetime.h中的动态函数
第25行: 用dlopen打开SOFILE共享库,返回句柄
第27-31行: 检测dp是否为空,为空则显示错误后退出;
第33行: 用dlsym取得getdate函数动态地址;
第35-40行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退
第42-43行: 执行getdate调用,输出当前日期;
第45行: 用dlsym取得gettime函数动态地址;
第47-52行: 如果dlerror返回值不为空,则dlsym执行出错,程序显示错误后退出;
第54-55行: 执行gettime调用,输出当前时间;
第57行: 用dlclose关闭dp所指示的动态链接库;
第59行: 程序退出,返回0值。
2.2.2 编写维护文件
维护文件makefile内容如下:
----------------------------------------------------------------------
1 # makefile : 纵横软件制作中心雨亦奇编写, .
3 all : dy
5 DYSRC = dy.c
7 DYTGT = $(DYSRC:.c=.o)
9 %.o : %.c
10 cc -c $?
12 # 动态库应用示范程序
13 dy : $(DYTGT)
14 cc -rdynamic -s -o $@ $(DYTGT) -ldl
----------------------------------------------------------------------
维护文件说明:
第3行: 定义所有需要维护的模块;
第5行: 定义源程序;
第7行: 定义目标文件;
第9-10行: 定义.o文件依赖于.c文件,维护代码为“cc -c 变动的源文件名”;
第13-14行: 定义dy依赖于变量DYTGT指示的值,维护代码中采用-rdynamic
选项以指定输出文件为动态链接的方式,选项-s指定删除目标文件中的符号
表,最后的选项-ldl则指示装配程序ld需要装载dl函数库。
2.2.3 运行make命令
运行make后将产生执行文件dy,运行后将产生如下类似信息:
动态链接库应用示范
当前时间: 10:06:21
当删除my.so文件时,将出现以下信息:
动态链接库应用示范
my.so: cannot open shared object file: 文件或目录不存在
LINUX创建与使用动态链接库并不是一件难事。
编译函数源程序时选用-shared选项即可创建动态链接库,注意应以.so后缀
命名,最好放到公用库目录(如/lib,/usr/lib等)下面,并要写好用户接口文件,
以便其它用户共享。
使用动态链接库,源程序中要包含dlfcn.h头文件,写程序时注意dlopen等
函数的正确调用,编译时要采用-rdynamic选项与-ldl选项,以产生可调用动
态链接库的执行代码。
阅读(...) 评论() &}

我要回帖

更多关于 msvcr100.dll是什么 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信