当前位置: 首页 > news >正文

ps怎么做网站首页界面网站导航界面

ps怎么做网站首页界面,网站导航界面,视频网站开发前景,餐饮公司网站制作静态加载、动态加载和延迟加载 dll加载方式大致可以分为3类:静态加载、动态加载和延迟加载 1.静态加载,dll的加载发生在程序main函数启动前。 2.动态加载,使用LoadLibrary或者LoadLibraryEx来加载一个dll。当dll加载成功时,你会…

静态加载、动态加载和延迟加载

dll加载方式大致可以分为3类:静态加载、动态加载和延迟加载

1.静态加载,dll的加载发生在程序main函数启动前。

2.动态加载,使用LoadLibrary或者LoadLibraryEx来加载一个dll。当dll加载成功时,你会得到一个非空的HMODULE。接下来,你可以使用GetProcAddress来获取这个HMODULE中的导出接口了。你可以理解成,静态链接的lib其实是帮我们在很早的时候就完成了这些事情。使用LoadLibrary有一些细节需要注意。首先是路径,它会在一些特定的路径寻找dll,如果没有找到则会报错。当成功加载了dll后,crt会初始化dll中的全局变量,并且HMODULE的引用计数会+1。如果LoadLibrary多次,在绝大部分的情况下,第一次之后的LoadLibrary会返回第一次的HMODULE,并且增加引用计数。所以,LoadLibrary要和FreeLibrary成对出现,如果你想要释放一个dll,load了多少次,就要free多少次。

3.延迟加载,是当dll需要时,才会被加载。为了使用一个延迟加载的dll,我们在生成exe的时候,需要更改链接器的一些设置,表示我们要用哪些延迟加载的dll:

动态载入 DLL方式

动态链接的情况下,有两个文件:一个是LIB文件,一个是DLL文件。LIB包含被DLL导出的函数名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到DLL文件。在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中相应函数代码的地址,从而节省了内存资源。DLL和LIB文件必须随应用程序一起发行,否则应用程序会产生错误。如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载。

动态载入方法是:用 LoadLibrary 函数加载动态链接库到内存,用 GetProcAddress函数动态获得 DLL 函数的入口地址。当一个 DLL 文件用 LoadLibrary 显式加载后,在任何时刻均可以通过调用 FreeLibrary 函数显式地从内存中把它给卸载。

动态调用使用的 Windows API 函数主要有 3 个, 分别是 LoadLibrary、 GetProcAddress 和FreeLibrary。

显示隐式加载

动态链接库有两种加载方式:隐式加载和显示加载:
隐式加载又叫载入时加载,指在主程序载入内存时搜索动态库,并将动态库载入内存。隐式加载也会有静态链接库的问题,如果程序稍大,加载时间就会过长,用户不能接受。
显式加载又叫运行时加载,指主程序在运行过程中需要动态库中的函数时再加载。显式加载是将较大的程序分开加载的,程序运行时只需要将主程序载入内存,软件打开速度快,用户体验好。

显示加载:extern c 的意义

C++程序(或库、目标文件)中,所有非静态(non-static)函数在二进制文件中都是以“符号(symbol)”形式出现的。这些符号都是唯一的字符串,从而把各个函数在程序、库、目标文件中区分开来。在C中,符号名正是函数名,两者完全一样。而C++允许重载(不同的函数有相同的名字但不同的参数,甚至const重载),并且有很多C所没有的特性──比如类、成员函数、异常说明──几乎不可能直接用函数名作符号名。为了解决这个问题,C++采用了所谓的name mangling。它把函数名和一些信息(如参数数量和大小)杂糅在一起,改造成奇形怪状,只有编译器才懂的符号名。例如,被mangle后的foo可能看起来像foo@4%6^,或者,符号名里头甚至不包括“foo”。

其中一个问题是,C++标准并没有定义名字必须如何被mangle,所以每个编译器都按自己的方式来进行name mangling。有些编译器甚至在不同版本间更换mangling算法(尤其是g++ 2.x和3.x)。说过,在显示调用动态库中的函数时,需要指明调用的函数名,即使您搞清楚了您的编译器到底怎么进行mangling的,从而知道调用的函数名被C++编译器转换为了什么形式,但可能仅仅限于您手头的这个编译器而已,而无法在下一版编译器下工作。

extern "C"即可以解决这个问题。用 extern "C"声明的函数将使用函数名作符号名,就像C函数一样。因此,只有非成员函数才能被声明为extern "C",并且不能被重载。尽管限制多多,extern "C"函数还是非常有用,因为它们可以象C函数一样被dlopen动态加载。冠以extern "C"限定符后,并不意味着函数中无法使用C++代码了,相反,它仍然是一个完全的C++函数,可以使用任何C++特性和各种类型的参数。所以extern "C" 只是告诉编译器编译和链接的时候都用c的方式的函数名字,函数里的内容可以为c的代码也可以为c++的。

隐式调用:

隐式调用不需要包含头文件dlfcn.h,只需要包含动态链接库中的头文件,使用动态库中的函数也不需要像显示调用那么复杂。
可以参考:静态库和动态库的制作。这个链接中调用动态库的方式就是隐式调用。

显示和隐式的区别

根据上面的显式调用和隐式调用的实例,可总结显示和隐式的区别如下:
1、 隐式调用需要调用者写的代码量少,调用起来和使用当前项目下的函数一样直接;而显式调用则要求程序员在调用时,指明要加载的动态库的名称和要调用的函数名称。
2、隐式调用由系统加载完成,对程序员透明;显式调用由程序员在需要使用时自己加载,不再使用时,自己负责卸载。
3、由于显式调用由程序员负责加载和卸载,好比动态申请内存空间,需要时就申请,不用时立即释放,因此显式调用对内存的使用更加合理, 大型项目中应使用显示调用。
4、当动态链接库中只提供函数接口,而该函数没有封装到类里面时,如果使用显式调用的方式,调用方甚至不许要包含动态链接库的头文件(需要调用的函数名是通过dlsym函数的参数指明的),而使用隐式调用时,则调用方必须要加上动态库中的头文件,g++编译时还需要要用参数-I指明包含的头文件的位置。需要注意的是,当动态链接库中的接口函数是作为成员函数封装在类里面时,即使使用显式调用的方式,调用方也必须包含动态库中的相应头文件(详见五、显示调用动态链接中的类成员函数)。
5、显式调用更加灵活,可以模拟多态效果。
6、显式调用的方式,必须加入头文件dlfcn.h,makefile中的链接命令中要加入参数-ldl,需要用dlopen加载库,dlsym取函数符号(函数名应用新定义的),dlclose卸载库。
7、隐式调用的方式,makefile中的链接命令中要加入参数-l加库名,直接用库里的函数名就可以。

http://www.yayakq.cn/news/506181/

相关文章:

  • 网站建设中html页面个人网站例子
  • 上海官网建设费用网站推广优化联系方式
  • 网站建设怎么找客源?江阴服装外贸现状
  • 网站开发专员岗位职责自学网站查分数
  • 政务信息公开与网站建设报告广州骏域网站建设专家手机电脑版
  • 鞍山网站开发公司平面设计免费自学网
  • 为什么邮箱突然进不去了总提示正在进入不安全网站WordPress实现网址导航
  • 网站制作论文文献综述可拖拽建设网站没有了吗
  • 网站公司哪家好标书制作
  • 举报网站制度建设方面枞阳县住房和城乡建设局网站
  • 微网站可以做成域名访问影院网站模板
  • 广州英文网站制作免费优化推广网站的软件
  • 营销型网站的例子财经大学网站建设
  • 昆明移动端网站建设网站片头怎么做
  • wordpress无法查看站点保定网站建设的过程
  • 国家胸痛中心建设网站做外汇看的网站
  • 论坛网站开发成本免费高清logo在线
  • 宜宾网站开发招聘景安怎么把网站做别名
  • 小企业网站建设制作平台wordpress octopress
  • 华为云助力企业网站安全保障网站建设需要什么证书
  • 如何选择营销网站建设政务网站建设工作方案
  • 餐饮酒店网站建设品牌运营岗位职责
  • 求个a站平面设计接单报价表
  • 河北建设厅八大员报名网站温州网站设计力推亿企帮
  • 网站添加关键词宁波seo外包费用
  • 网站建设岗位任职资格专业微网站电话号码
  • 网站为什么需要备案号有效的引流推广方法
  • 成都做网站的公司恩施网站优化
  • 合肥金融网站设计长沙 汽车 网站建设
  • 网银网站模板seo排名哪家正规