博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows动态链接库使用方法
阅读量:6527 次
发布时间:2019-06-24

本文共 3143 字,大约阅读时间需要 10 分钟。

Windows动态链接库DLL

1.什么是DLL
DLL,即动态链接库,是包含若干个函数的库文件,可供其他程序运行时调用。

2.DLL的优缺点

优点:代码重用,可供多个程序同时调用

缺点:易发生版本冲突

当新版本的动态链接库不兼容旧版本时,其他使用该DLL的程序可能无法正常工作。
针对这一问题,我们需要在程序中加上一个manifest文件,指明该程序所使用的DLL版本号。
此时,程序将根据manifest加载指定版本的DLL,否则按默认版本加载。

3.关于LIB和DLL

LIB,是静态链接库,分为静态lib和动态lib。
静态lib:包含函数代码声明和实现,编译后所有代码都嵌入到宿主程序中。不需要再另行调用DLL。
动态lib:相当于一个.h头文件,它是对实现部分(.DLL)的导出部分的声明。编译后宿主程序也只包括声明部分。运行时需调用相应的DLL文件。

 

1 #ifndef _MYMATH_H 2 #define _MYMATH_H 3 #include 
4 5 6 #ifdef MYMATHDLL_EXPORT 7 #define MYMATHDLL_API _declspec(dllexport) 8 #else 9 #define MYMATHDLL_API _declspec(dllimport)10 #endif // end of MYMATHDLL_EXPORT11 12 #ifdef __cplusplus13 extern "C" {14 #endif // end of __cplusplus15 16 int MYMATHDLL_API Add(int a, int b);17 18 int MYMATHDLL_API Sub(int a, int b);19 20 int MYMATHDLL_API Mul(int a, int b);21 22 int MYMATHDLL_API Div(int a, int b);23 24 #ifdef __cplusplus25 }26 #endif // end of __cplusplus27 28 29 30 #endif// end of _MYMATH_H
1 #include "stdafx.h" 2  3 #define MYMATHDLL_EXPORT 4 #include "MyMath.h" 5 #include 
6 7 8 9 int Add(int a, int b)10 {11 printf("Call %s\n", __FUNCTION__);12 return a + b;13 }14 15 int Sub(int a, int b)16 {17 printf("Call %s\n", __FUNCTION__);18 return a - b;19 }20 21 int Sub(int a, int b, int c)22 {23 return a + b + c;24 }25 26 int Mul(int a, int b)27 {28 printf("Call %s\n", __FUNCTION__);29 return a * b;30 }31 32 int Div(int a, int b)33 {34 printf("Call %s\n", __FUNCTION__);35 return a / b;36 }

main

1 #include 
2 #include
3 4 #include "MyMath.h" 5 #pragma comment(lib, "DllTest.lib") 6 7 void ExplicitCall(); 8 void ImplicitCall(); 9 10 int main()11 {12 std::cout << "Hello World!\n"; 13 ImplicitCall();14 //ExplicitCall();15 return 0;16 }17 18 void ExplicitCall()19 {20 typedef int(*pAdd)(int a, int b);21 22 typedef int(*pSub)(int a, int b);23 24 HINSTANCE hDll = NULL;25 pAdd _Add = NULL;26 pSub _Sub = NULL;27 28 29 hDll = LoadLibrary(L"DllTest");30 31 if (hDll == NULL) std::cout << "failed to call LoadLibrary\n";32 33 DWORD lastError = 0;34 35 if ((_Add = (pAdd)GetProcAddress(hDll, "Add")) == NULL)36 {37 std::cout << "failed to call GetProcAddress Add\n" << std::endl;38 lastError = GetLastError();39 std::cout << "Add lastError = " << lastError << std::endl;40 }41 42 43 if ((_Sub = (pSub)GetProcAddress(hDll, "Sub")) == NULL)44 {45 std::cout << "failed to call GetProcAddress Sub\n" << std::endl;46 lastError = GetLastError();47 std::cout << "Sub lastError = " << lastError << std::endl;48 }49 50 int a = 10, b = 6, c = 17;51 int addVal = _Add(a, b);52 53 int subVal = _Sub(a, b);54 55 std::cout << "addVal = " << addVal << ", subVal = " << subVal << std::endl;56 FreeLibrary(hDll);57 }58 59 void ImplicitCall()60 {61 62 int a = 10, b = 6, c = 17;63 int sum = Add(a, b);64 int sub = Sub(a, b);65 std::cout << "addVal = " << sum << ", subVal = " << sub << std::endl;66 }

 

转载于:https://www.cnblogs.com/endenvor/p/10268549.html

你可能感兴趣的文章
【最佳实践】OSS开源工具ossutil-大文件断点续传
查看>>
Linux常用的服务器构建
查看>>
深入了解 Weex
查看>>
Android第三方开源FloatingActionButton(com.getbase.floatingactionbutton)【1】
查看>>
【75位联合作者Nature重磅】AI药神:机器学习模型有望提前五年预测白血病!
查看>>
精通SpringBoot——第二篇:视图解析器,静态资源和区域配置
查看>>
JavaScript基础(六)面向对象
查看>>
总结几点Quartz的经验
查看>>
企业的最佳选择?开放式混合云大行其道
查看>>
物联网、自动化的冲击下未来20年职场六大趋势
查看>>
《Java核心技术 卷Ⅱ 高级特性(原书第10版)》一3.6.2 使用StAX解析器
查看>>
9月26日云栖精选夜读:阿里Java代码规约插件即将全球首发,邀您来发布仪式现场...
查看>>
北京市交管局联合高德地图发布北京中考出行提示
查看>>
如何防止应用程序泄密?
查看>>
一文带你看懂物联网开源操作系统
查看>>
什么是实践中真正在用的数据科学系统?
查看>>
新型智慧城市:构建“互联网+”新生活
查看>>
韩企全球首造72层3D NAND芯片 下半年或量产
查看>>
《R语言编程艺术》——1.4 R语言中一些重要的数据结构
查看>>
如何让你的手机比别人最先升级到 Android L
查看>>