C语言培训讲义4.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言培训教程 4 张建 2005-3 Budzhang@ 静态库 制作静态库 库是C/C++开发环境里的一个基本对象 实际开发有两种模式: 静态库:嵌入式平台等 动态库:主流的操作系统 VC的库管理工具 Lib 例子1/4 例子2/4 例子3/4 例子4/4 编译 编译为标文件 CL /c add.c sub.c 把目标文件做成库 LIB /out:tool.lib add.obj sub.obj 使用库 CL test.c tool.lib VC环境的注意事项 VC分Release模式和Debug模式 代码用的库不同 在VC里制作库时注意模式 前面例子是Release模式 DLL动态链接库(初级) 动态库的背景 主流操作系统都采用动态连接库技术,而静态库已经过时 基于虚拟内存管理技术 特点 代码是独立的载体;而静态库则要复制到exe文件里 运行时加载,可以根据需要调用 可以方便的升级系统而无须重新编译 适合做插件和可扩展的结构设计 例子 编译 编译 CL /LD /Fetool add.obj sub.obj tool.def (CL /LD /Fetool add.c sub.c tool.def) 连接 CL test.c tool.lib 练习 动态库的一个重要用途是单独升级,而无需重新编译exe文件 修改add函数和sub函数,重新编译为tool.dll文件,再次运行test.exe文件 DllMain 1 在加载DLL时系统自动调用DllMain函数 利用DllMain函数做DLL级的初始化和清除工作 DllMain 2 加载原因 DLL_PROCESS_ATTACH DLL_PROCESS_DETACH DLL_THREAD_ATTACH DLL_THREAD_DETACH 例子 编译dllmain 编译 CL /LD /Fetool tool.c add.c sub.c tool.def 连接 CL test.c tool.lib DLL动态链接库(基本) 显式动态连接 Win32函数 LoadLibrary,FreeLibrary GetProcAddress 函数声明 例子 加载动态库 1 查找不到返回NULL 明确路径 隐式路径 程序加载目录 当前目录 Windows System目录 Windows目录 PATH环境变量 加载路径的安全性 输出一个变量 DLL可以输出函数 DLL也可以输出变量:定义方法、查找方法和函数一样 观察DLL文件中的输出函数或变量 Dumpbin.exe Dumpbin /exports tool.dll 案例:插件 设计一个插件接口,允许挂接各种类似add函数的插件:add,sub,mul,dev 插件接口 插件管理接口 插件装载 插件卸载 插件调用 例子:add插件1 例子:add插件2 VC扩展关键字 VC提供专门的关键字,方便输出函数和变量;可替代def文件 _declspec(dllexport) _declspec(dllexport) int add(int a,int b); 例子 练习 编写以下插件 sub、mul、dev 在前面案例中,对插件进行遍历调用。修改插件调用部分:根据给定的命令调用相应的插件 如:指定add,查找到相应的插件来调用该插件函数 作业 可交互式接收文本的算术命令,调用相应的插件返回结果 如 100 + 200 ,程序可以去调用 add插件,计算后返回结果 初级 基于前面的插件例子实现一个程序 高级 自己设计插件接口,实现上述程序 //cj.c #include spfn.h #include manage.h #include stdio.h struct s_interface2 g_interface[INTERFACENUM]; char *g_filename[INTERFACENUM]={add,sub,mul,dev,NULL}; int main(int argc, char *argv[]) { int i; struct s_pfn2 *pfn2; int a,b,c; a=100; b=200; init(); //加载插件 for(i=0;g_interface[i].pfn2 != NULL;i++){ //使用插件 pfn2 = g_interface[i].pfn2; if(pfn2-pfinit != NULL) (*pfn2-pfinit)(NULL); if(pfn2-pfn2 != NULL) c = (*pfn2-pfn2)(a,b); if(pfn2-pfclose != NULL) (*pfn2-pfclose)(); printf(%

文档评论(0)

iris + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档