利用Visual Studio创建C语言dll

2023-05-16

利用VS2019创建dll方法

    • 动态链接库的定义及意义
    • 如何在VS创建dll
    • 入口函数DLLMain
    • 如何创建导出函数
    • 动态调用导出函数

动态链接库的定义及意义

动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。
动态链接提供了一种方法,使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 文件中,该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。

如何在VS创建dll

首先在VS初始界面选择创建新项目,如图所示在这里插入图片描述
选择动态链接库(DLL),选择好项目位置后点击创建。

入口函数DLLMain

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}

APIENTRY:__stdcall的宏定义, __stdcall是一种函数调用约定,被该关键字修饰的函数,其参数都是从右向左通过堆栈传递的 ,函数调用在返回前要由被调用者清理堆栈。
HMODULE:HMODULE表示模块句柄,在VS的速览定义中,我们可以查到HMODULE为HINSTANCE的宏定义,而HINSTANCE为void的宏定义。
DWORD:double word类型,为unsigned long宏定义,指明了调用原因。
LPVOID:void far
宏定义,其中far指针的长度为32位,代表了该指针与其指向的数据段可能位于不同的段,使指针能够指向更大的内存范围。
DLL_PROCESS_ATTACH:当DLL被进程加载时DLLMain被调用
DLL_THREAD_ATTACH:当有线程被创建时DLLMain被调用
DLL_THREAD_DETACH:当有线程结束的时候DLLMain被调用
DLL_PROCESS_DETACH:当DLL被线程卸载的时候DLL被调用

如何创建导出函数

给函数加上__declspec(dllexport)修饰符,那么它就是一个导出函数了。
我们在项目中另创建一cpp文件,用于定义导出函数。
在这里插入图片描述
下面是导出函数的定义,由于我们希望编译器认识该函数为C语言函数,加上了extern "C"标志:

#include <stdio.h>
#include "pch.h"

extern "C" __declspec(dllexport) void fun() {
    printf("dll function export sucessfully\n");
}

生成解决方案后,我们可以看到显示出这样一段话:在这里插入图片描述
在项目的DEBUG文件夹下,我们可以看到生成的.dll文件

动态调用导出函数

动态调用DLL利用了LoadLibrary和GetProcAddress函数。
新建一个项目,将之前生成的dll文件放入该项目的目录下
在这里插入图片描述

#include <windows.h>
#include <tchar.h>
typedef void(*lpFun)(void);
int main() {
 HINSTANCE hDLL;
 lpFun fun;
 hDLL = LoadLibrary(_T("Dll1.dll"));
 if (hDLL != NULL) 
 {
  fun = (lpFun)GetProcAddress(hDLL, "fun");
  if(fun != NULL)
   fun();
  FreeLibrary(hDLL);
 }
}

先通过LoadLibrary链接dll文件,再通过GetProcAddress函数获取dll中的函数,运行可以得到:

在这里插入图片描述可见DLL函数被成功调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用Visual Studio创建C语言dll 的相关文章

  • LoadLibrary 失败:第一次机会异常 0xC0000139(未找到 DLL)- 如何调试?

    我有一个 dll mytest dll 当通过加载时LoadLibrary 返回 NULL 并且 127 作为GetLastError 如果我在 mytest dll 上使用 DependencyWalker 它会报告它应该正确加载并且所有
  • P/Invoke 是否执行 DLL 然后将其关闭?

    如果我使用 C P Invoke 某个 DLL 实际的 C DLL 是否会在调用期间运行 然后关闭 从而销毁所有已使用的内存 或者 NET 是否会在非托管 堆 中负责 C DLL 使用的内存 并在每次调用静态函数时将指向这些对象的指针提供给
  • 以调试器友好的方式从 RAM 加载本机 C++ .dll

    问题目前仅涉及 Windows 其他操作系统目前不太相关 只需通过快速谷歌搜索 就可以从 RAM 加载本机 dll 例如有以下库 https www joachim bauch de tutorials loading a dll from
  • 从 C++ 托管 dll 引发的 C# 异常 - EEFileLoadException * __ptr64

    我从正常的 C 控制台程序中收到此错误 该程序使用作为 C CLI 项目的构建输出生成的 DLL 那里我有一个简单的DumbThing public ref class用静态方法 我想简单地调用该函数 或者至少实例化一个微小的 DumbTh
  • 如何在 Inno Setup 中将 VCL 样式应用到基于 DLL 的表单?

    我正在将 Inno Setup Unicode 与我在 Delphi XE2 中编写的一组 DLL 一起使用 DLL 具有在安装向导 安装过程中显示的 VCL 形式 我已经尝试过实施 VCL 样式 https code google com
  • 将函数指针作为参数传递给 dll 函数并从 dll 内部调用它们是否安全?

    我想将一些 无论是否为 dll 函数指针作为参数传递给一些 dll 函数 并从 dll 内部调用它们 我想知道它是否安全 因为我找到了有关的信息http publib boulder ibm com infocenter zos v1r10
  • Qt5.8.0缺少vcruntime140d_app.dll

    我有一个非常简单的 Qt 应用程序 由 main cpp mainwindow cpp mainwindow h 和 mainwindow ui 组成 各内容如下所示 main cpp include mainwindow h includ
  • 在 Windows XP 上安装 JDK8 - advapi32.dll 错误

    我下载了JDK8 https jdk8 java net download htmlbuild b121 并在尝试安装时出现以下错误 the procedure entry point RegDeleteKeyExA could not b
  • Python 和 libstdc++ 的动态库问题

    执行摘要 Python 模块链接到不同版本的libstdc dylib比 Python 可执行文件 结果是调用iostream从模块崩溃 背景故事 我正在一台旧计算机 运行 10 5 8 上使用 SWIG 创建一个 Python 模块 由于
  • 如何判断您的 C# 应用程序正在使用哪个 dll?

    我有一个使用 dll 的应用程序 该 dll 充满了位于位置 x 的 gui 应用程序代码 以前有 1 个按钮 现在有 2 个 当我启动我的应用程序时 我期望看到的是一个带有 2 个按钮的 gui 但是我看到一个带有 1 个按钮的 gui
  • 如何在 C++ 运行时组件内的 Windows Phone 8.1 XAML 应用程序中使用 C++ dll

    我想在我的 C Windows Phone 8 1 XAML Visual Studio 项目中使用 C DLL 为 Arm x86 编译 我创建了一个 C 运行时组件来与我的 C 代码交互 此代码需要预编译的 dll 我将 lib 文件添
  • 了解静态链接嵌入式lua环境中lua扩展dll的构建/加载

    我有一个相对复杂的 lua 环境 我试图了解以下内容如何工作 起始设置包括以下两个模块 主要应用 无lua环境 DLL 静态链接到lua lib 包括解释器 该 dll 被加载到主应用程序中 并运行 lua 控制台解释器和可从控制台访问的
  • 如何停止对辅助隐式加载 DLL 的 DLL 劫持

    例如 COMDLG32 DLL 隐式链接到以下系统 DLL 以及其他 xmllite dll dll srvcli dll wkscli dll 链接信息库 netutils dll 微星 dll 由于这些是由操作系统隐式加载的 而不是使用
  • 未找到入口点

    当我尝试运行链接到 DLL 的应用程序 我有一段时间没有更改代码 因为它工作正常 时 遇到了一个奇怪的错误 这个 DLL 曾经可以工作 但我一直在更改 DLL 的代码并使其编译正常 不幸的是 当尝试运行该应用程序时 GameTest001
  • php 7 无法初始化 sqlsrv

    我搜索了一整天 寻找 php 7 VC14 x64 Thread Safe 上 sqlsrv dll 的解决方案 但没有找到解决方案 有没有人解决这个问题 04 Oct 2015 19 48 05 UTC PHP Warning PHP S
  • Visual Studio 设置以在运行时删除对 dll 文件的依赖

    到处都有人建议当 Visual Studio 在运行时找不到 DLL 时如何让 Visual Studio 知道 但我想知道在哪里删除该选项 以便 Visual Studio 在运行时不会尝试查找 dll 文件 我昨天也有类似的问题 但没有
  • Unity HTML5 错误:找不到编码 1252 数据

    我使用的是 Mac 在 Google Chrome 中执行我的小应用程序时 出现 不支持代码页 1252 的 pb 我正在使用Unity 2017 年 6 月测试版为了整合几何健身房IFClib 的编码为 NET 4 6 现在在最后一个 U
  • 根据环境选择目标 32 位或 64 位本机 DLL

    我有一个本机 DLL 有 32 位和 64 位版本 x86 我想创建一个适用于两种体系结构 任何 CPU 的包装器 并根据当前环境 32 位或 64 位 在运行时 加载 DLL 的正确版本 这个过程应该自动发生 这样我的 DLL 的用户就不
  • 如何制作包含DLL文件的JAR文件?

    我购买了一个第三方Java库 其中包括一个JAR文件和两个DLL文件 我编写了自己的 Java 程序来调用第三方 JAR 文件 现在我的问题是如何将我的所有代码打包到一个 JAR 文件中 其中包含我的所有代码以及第三方 JAR 和 DLL
  • 为 C# 和 C++ 应用程序编写 DLL

    我需要编写几个 DLL 它们都可以从 C 应用程序和 C 应用程序访问 最初 我认为通过用 C 编写 DLL 并从 C 和 C 应用程序链接到它们可以节省时间 精力 这种方法明智吗 还是应该使用 C 编写 DLL 我的建议是在您最舒服的地方

随机推荐

  • realsense D430 python采集深度图像,并保存为txt及pcd点云,用于open3D后处理

    D430点云是x y z 将realsense D430保存的点云文件 pcd 需要对数据进行处理 废话不多说 直接上代码 span class token comment coding utf 8 span span class toke
  • 隐藏符号 __dso_handle 问题

    这几天要给项目做移植 xff0c 重写了下Makfile 项目原是使用autoconf配置的 xff0c 但在新环境下对autoconf的支持不好 Makefile编写基本按autoconf生成的Makefile来的 xff0c 编译选项等
  • 类模板成员函数

    模板类的头文件 span class token macro property span class token directive hash span span class token directive keyword ifndef s
  • C++ 在.h文件中包含头文件和在.cpp文件中包含头文件的原则

    1 第一个原则 xff1a 如果可以不包含头文件 xff0c 那就不要包含了 xff0c 这时候前置声明可以解决问题 如果使用的仅仅是一个类的指针 xff0c 没有使用这个类的具体对象 xff08 非指针 xff09 xff0c 也没有访问
  • NRF24L01数据通信C程序

    NRF24l01 产品性能 xff1a 1 xff09 2 4GHZ全球开放ISM频段免许可使用 2 xff09 最高工作速率2Mbps GFSK高效调制 3 xff09 125个频道满足多点通讯和跳频通讯需求 4 xff09 1 9 3
  • gazebo仿真之xacro文件

    span class token operator lt span span class token operator span xml version span class token operator 61 span span clas
  • c++ 释放内存 野指针

    在释放内存之时 xff0c 不仅仅是将该块内存进行释放 xff0c 还要将指向该块内存的指针置为NULL 如果不置为NULL xff0c 下次继续使用该指针时会出现问题 具体看示例 在下面的示例中 xff0c 如果没有处理野指针的那句话 x
  • 二维码识别 -- 基于ros平台下的仿真

    生活中的二维码 二维码是用某种特定的几何图形按一定规律在平面 xff08 二维方向上 xff09 分布的黑白相间的图形记录数据符号信息的 xff1b 在代码编制上巧妙地利用构成计算机内部逻辑基础的 0 1 比特流的概念 xff0c 使用若干
  • ROS中控制机械臂抓取目标例程

    在上一个博文中介绍了一个简单的目标识别的例子 xff0c 在这篇博客中 xff0c 例如是别的结果 xff0c 完成机械臂的抓取控制 xff0c 主要进行程序的分析和学习 包含的头文件 xff1a include lt ros ros h
  • STM32_Debug 使用ST-Link进行调试出现Error:Flash Download Failed-"Cortex-M3" 解决方案

    在Debug窗口依次注意以下几个点 xff1a 1 选择与主控芯片相配套的芯片 2 选择ST Link Debugger 此处注意该页面最下面一行可不更改 xff08 亲测有效 xff09 3 接上图点击进入Setting xff0c 依次
  • 标准外设库(STD库)、HAL库、LL库三者区别

    转自 xff1a https blog csdn net zcshoucsdn article details 54613202 2018 1 19 HAL库详解见STM32之HAL库详解 及 手动移植 STM32 Embedded Sof
  • FOC矢量控制

    FOC xff08 Filed Oriented Control xff09 是采用数学方法实现三相马达的力矩与励磁的解耦控制 主要是对电机的控制电流进行矢量分解 xff0c 变成励磁电流 I d Id 之后我将详细介绍一下这个算法的数学原
  • Linux网络编程8——对TCP与UDP的简易封装

    引言 每次使用socket通信 xff0c 都会有很对相似的操作 本文 xff0c 会对TCP与UDP通信做一简单封装 xff0c 并生成动态库 代码 my socket h ifndef MY SOCKET H define MY SOC
  • 分分钟带你入门无刷电机控制_P-NUCLEO-IHM001套件评测使用

    终于有时间将前段时间把有关ST公司的分分钟带你入门无刷电机控制 P NUCLEO IHM001套件评测的资料系统的整理一下 刚一开始接触接触这个套件的时候感觉这是什么鬼 xff0c 可以实现正弦波矢量控制 xff1f 这么强 xff0c 慢
  • SiamFC代码配置复现

    写在前面 最近在研究SiamRPN xff0c 究其根本 xff0c CNN依托于AlexNet骨架 xff0c 所以花些功夫研究以下SiamFC代码 xff0c 将其阶段性复现 Tracking only 关于GPU显卡配置 cudn和c
  • PySOT

    写在前面 期待已久的PySOT终于放上了code xff0c 高兴ing xff0c 赶忙进行相应的配置加以复现 xff0c 不得不说 xff0c 作者真的很贴心 xff0c 把配置环境的指令封装成脚本 xff0c 直接按需配置即可 但是在
  • 【Linux】SocketCan c语言编程

    前言 为了能够对Socket CAN的深入理解 xff0c 我们需要了解Socket的机制 Socket的中文翻译为 插座 xff0c 在计算机世界里称为套接字 Socket最初是作为网络上不同主机之间进程的通信接口 xff0c 后来应用越
  • VMWare虚拟机网络配置及虚拟机远程rviz显示雷达数据

    虚拟机网络配置 1 工具 环境 本机 xff1a Windows 10 64位虚拟机 xff1a VMware Workstation xff0c Ubuntu 18 04 2 Windows配置 WLAN部分 网络和Internet配置
  • 2022数学建模国赛B题思路分析

    分享一下 xff0c 仅供参考借鉴 xff0c 切勿直接使用 xff01 致谢一下全糖奶茶屋 xff01 一 问题重述 1 1 问题背景 由于无人机集群在遂行编队飞行时 应尽可能的避免外界干扰 因此需要尽可能的保持电磁静默减少电磁波信号的发
  • 利用Visual Studio创建C语言dll

    利用VS2019创建dll方法 动态链接库的定义及意义如何在VS创建dll入口函数DLLMain如何创建导出函数动态调用导出函数 动态链接库的定义及意义 动态链接库 xff08 Dynamic Link Library 或者 Dynamic