动态链接库的简单应用

简介:  动态链接库是windows下实现数据共享的一种重要方法,它提供了 二进制层上的共享。 动态链接库 可以很好的实现 项目模块之间的分离,如果某一模块出错不需要重新编译整个项目,只需要修改相应的模块 ,以及在产品的升级过程中 我们可以通过替换dll文件来实现产品的升级. 动态链接库包含2个文件  lib因入口 和dll动态链接库  ,我们在程序中通过已入库 来调用dll文件中 存储的函数 。

 动态链接库是windows下实现数据共享的一种重要方法,它提供了 二进制层上的共享。

动态链接库 可以很好的实现 项目模块之间的分离,如果某一模块出错不需要重新编译整个项目,只需要修改相应的模块 ,以及在产品的升级过程中 我们可以通过替换dll文件来实现产品的升级.

动态链接库包含2个文件  lib因入口 和dll动态链接库  ,我们在程序中通过已入库 来调用dll文件中 存储的函数 。

DLLMain函数 是DLL文件的入口函数 在dll进行初始化或者释放的时候都会调用这个函数,相对应的就是 LoadLibrary和 FreeLibrary  函数

在动态链接库中只有 指定为   _declspec(export)的函数 以及变量可以被 外部程序所调用 .

在外部程序调用的时候需要  声明为   _declspec(dllimport )  .......或者 extern.........声明 。。

在C/C++中我们是可以 这样使用 ,因为 VC这个IDE知道这个命名规范 , 

在VC中 动态链接库 默认 导出的 名字是         _FunctionName@参数表字节总数         ,那么我们就需要以这样的格式导入 函数  ,如果嫌函数声明麻烦 ,那么就声明模块定义文件

来固定函数名称 。,

  __stdcall是函数调用约定的一种,函数调用约定主要约束了两件事:

  1.参数传递顺序

  2.调用堆栈由谁(调用函数或被调用函数)清理

  常见的函数调用约定:stdcall cdecl fastcall thiscall naked call

  __stdcall表示

  1.参数从右向左压入堆栈

  2.函数被调用者修改堆栈

  3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸

  在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。

下面是在VC6中简单的调用  dll中  类的 函数的代码

#define  DLLExport _declspec(dllexport)  //声明调用约定
#include <iostream>
using namespace std ;
 DLLExport void Show()
{
 cout<<"This is a simple  dll test !" <<endl ;
}

class DLLExport  MyClass  //放在关键字后面
{
public: 
 MyClass(int x ,int  y)
 {
   this->x=x ;
   this->y=y ;
 }
 void Show()
 {
  cout<<"x="<<x<<endl ;
     cout<<"y="<<y<<endl ;
 }
private:
 int x  ;
 int y   ;
};

 

下面是 在另一个工程中调用 dll

#pragma  comment(lib,"TestLibrary")
#define  DLLImport _declspec(dllimport)
DLLImport void Show() ;
class   DLLImport MyClass
{
public:
  int x ;
  int  y ;
public:
  MyClass(int x,int y) ;
  void Show() ;

};
void main()
{
Show() ;
MyClass cls(2,3);
cls.Show()  ;

}

 

 

 

 

目录
相关文章
vscode配置eslint保存自动修复
vscode配置eslint保存自动修复
575 1
|
安全 Android开发 开发者
探索安卓开发的未来:Kotlin的崛起与Flutter的挑战
在移动开发的广阔天地中,安卓平台始终占据着举足轻重的地位。随着技术的不断进步和开发者需求的多样化,Kotlin和Flutter成为了改变游戏规则的新玩家。本文将深入探讨Kotlin如何以其现代化的特性赢得开发者的青睐,以及Flutter凭借跨平台的能力如何挑战传统的安卓开发模式。通过实际案例分析,我们将揭示这两种技术如何塑造未来的安卓应用开发。
243 6
|
Java 关系型数据库 MySQL
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
②⑩② 【读写分离】Sharding - JDBC 实现 MySQL读写分离[SpringBoot框架]
255 0
|
关系型数据库 MySQL 索引
MySQL不走索引的情况分析
MySQL不走索引的情况分析
275 0
MySQL不走索引的情况分析
|
缓存 Ubuntu Linux
在Linux中,如何检查系统更新?
在Linux中,如何检查系统更新?
|
网络协议 安全 网络性能优化
HTTP、HTTPS和TCP的特点和三者的区别
TCP提供连接、可靠性、流量和拥塞控制,HTTP基于请求-响应模型且无连接、无状态,HTTPS则通过数字证书确保服务器身份验证和加密通信。
|
存储 运维 安全
高校实验室管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
高校实验室管理系统 毕业设计 JAVA+Vue+SpringBoot+MySQL
432 0
|
Java 编译器 数据安全/隐私保护
【SpringMVC】自定义注解与AOP结合使用
【SpringMVC】自定义注解与AOP结合使用
298 0
|
存储 Kubernetes 容器
k8s 中 PV 和 PVC 的生命周期
【4月更文挑战第30天】
|
消息中间件 Linux
RabbitMq 安装部署
RabbitMq 安装部署