如何创建与调用动态链接库

2024-06-06 23:58

本文主要是介绍如何创建与调用动态链接库,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

静态链接库与动态链接库区别:
  静态链接库:lib中的指令被直接包含在最终生成的EXE文件中。
  动态链接库:dll不必被包含在最终的EXE中,EXE文件执行时可以动态地引用和卸载DLL文件。
  同时,静态链接库中不能再包含其他的动态链接库或静态库,而动态链接库中可以包含其他的动态或静态库。
  VC++支持的DLL:
  DLL的编制与具体的编程语言及编译器无关,动态链接库随处可见,VC++支持三种DLL:非MFC动态库、MFC规则DLL和MFC扩展DLL。DLL导出函数(或变量、类)可供应用程序调用;DLL内部函数只能在DLL程序内使用,应用程序无法调用它们。
  导出函数的声明方式:
  一种在函数声明类型和函数名之间加上“_declspec(dllexport)”。
  另外一种采用模块定义(.def)文件声明,需要在库工程中添加模块文件,格式如下:
  LIBRARY 库工程名称
  EXPORTS 导出函数名
  DLL的调用方式:
  一种静态调用,由编译系统完成对DLL的加载和应用程序结束时DLL的卸载。
  另外一种动态调用,由编程者用API函数加载和卸载DLL(DLL加载—DLL函数地址获取—DLL释放)方式。
  所有库工程编译时必须Release方式:
  Build—set active configuration—选择库工程的release方式
  示例:
  一、 函数----创建动态链接库(MFC规则DLL)
  1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名为MFC_dll
  2. def文件中添加:函数名(Add_new)
  3. h文件中添加:外部函数声明//求和函数,函数名为Add_new
  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
  4. cpp文件中添加: 外部函数实现
  extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
  {
  return a+b;
  }
  5. build--set active configuration--win32 release--ok
  6. 生成
  7. 根目录下release文件夹中dll,lib与根目录下h文件即为所需
  二、 函数----调用动态链接库(把MFC_dll.dll和MFC_dll.lib拷到工程所在目录)
  //静态调用(.h可以写到.cpp文件中)
  1. new--projects--win32 console application--an empty project
  2. 添加h文件:(test.h)
  #pragma comment(lib,"MFC_dll.lib") //告诉编译器DLL相对应的lib文件所在路径和文件名
  extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//声明导入函数
  3. 添加cpp文件:(main.cpp)
  #include "test.h"
  int main()
  {
  cout<<Add_new(10,3);
  return 0;
  }
  //动态调用
  #include <stdio.h>
  #include <windows.h>
  typedef int (* lpAddFun)(int ,int);//定义一个与Add_new函数接受参数类型和返回值均相同的函数指针类型
  int main()
  {
  HINSTANCE hDll;//句柄
  lpAddFun addFun;//函数指针
  hDll=LoadLibrary("dllTest.dll");//动态加载DLL模块句柄
  if(hDll)
  {
  addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所加载DLL模块中函数的地址
  if(addFun)
  {
  int result=addFun(2,3);
  printf("%d",result); } FreeLibrary(hDll);//释放已经加载的DLL模块
  }
  return 0;
  }
  三、 变量----创建动态链接库(非MFC DLL)
  1. new---projects---win32 dynamic-link library----an empty project(Sample)
  2. 添加sample.h
  #ifndef SAMPLE_H
  #define SAMPLE_H
  extern int dllGlobalVar;
  #endif
  3. 添加 sample.cpp
  #include "sample.h"
  #include <windows.h>
  int dllGlobalVar;
  bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
  //windows在加载DLL时,需要一个入口函数,就如同控制台或DOS程序需要main函数、win32程序需要winmain函数一样。所以引入一个不做任何操作的缺省DllMain的函数版本。是DLL的内部函数。

这篇关于如何创建与调用动态链接库的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1037601

相关文章

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。