【C语言笔记】dll库“__declspec”属性关键字总结,dllexport,dllimport

dll库“__declspec”属性关键字总结,dllexport,dllimport

  • 一,简介
  • 二,介绍
    • 2.1 __declspec(dllexport)
      • 示例:
      • 1,extern "C":
      • 2,__declspec(dllexport):
    • 2.2 __declspec(dllimport):
      • 示例:
      • DllImport 属性:
  • 三,总结

一,简介

__declspec 是在 Windows 平台上用于控制导出和导入符号的属性关键字,在 C/C++ 中经常用于 DLL 开发。
__declspec(dllexport) 和 __declspec(dllimport) 是其常见用法,用于在编写 DLL 时标记函数或变量的可见性。

二,介绍

2.1 __declspec(dllexport)

  • 在编写 DLL 时用于标记函数或变量,表示它们应该被导出,以便其他模块可以访问。
  • 用于将函数或变量从 DLL 中导出,使其可供外部使用。
  • 在函数或变量声明之前使用,告诉编译器将其放入导出表中。
  • 可以与 extern “C” 一起使用以确保按照 C 语言的命名规则导出。

示例:

#include <Windows.h>extern "C" __declspec(dllexport) void HelloWorld() {MessageBox(NULL, "Hello from DLL!", "Message", MB_ICONINFORMATION);
}

extern “C” __declspec(dllexport) void HelloWorld() 这行代码是在 C++ 中定义一个函数,并使用了两个关键字来修饰函数的声明:

1,extern “C”:

  • extern “C” 是 C++ 中的语法,用于指定采用 C 语言的命名和调用约定。
  • 这个修饰符告诉编译器,函数的名称应该按照 C 语言的命名规则进行处理,这样可以确保函数在链接时使用 C 标准的调用约定。
  • 这在编写 DLL 时特别有用,因为 C 语言调用约定是最常见的。

2,__declspec(dllexport):

  • __declspec(dllexport) 是 Windows 平台上的扩展属性关键字,在 C/C++ 中用于标记函数或变量,表示它们应该被导出,以便其他模块可以访问。
  • 这个关键字告诉编译器,这个函数将会被放入 DLL 的导出表中,从而使得其他程序可以调用这个函数。

综上所述,extern “C” __declspec(dllexport) 这段代码用于定义一个被导出的函数,并确保它的命名和调用约定符合 C 语言的标准,以便其他模块可以正确地访问和调用这个函数。

2.2 __declspec(dllimport):

  • 在编写客户端应用程序时用于标记函数或变量,表示它们应该从 DLL 中导入。
  • 用于告知编译器在链接时从 DLL 中获取函数或变量的地址。
  • 在函数或变量声明之前使用,告诉编译器这些函数或变量是从外部 DLL 中导入的。

示例:

using System;
using System.Runtime.InteropServices;public class Example {[DllImport("user32.dll")]public static extern int MessageBox(int hWnd, string text, string caption, int type);public static void Main() {MessageBox(0, "Hello World!", "Message", 0);}
}

在这段代码示例中,[DllImport(“user32.dll”)] 是 C# 中的属性,用于指示编译器在运行时将指定的函数从外部的 user32.dll 动态链接库(DLL)中加载并调用。

具体含义如下:

DllImport 属性:

  • DllImport 是 System.Runtime.InteropServices
    命名空间中的属性,用于告诉运行时系统去加载并调用指定的非托管函数,这些函数通常存在于 DLL 中。
  • [DllImport(“user32.dll”)] 指示了要调用的函数位于名为 user32.dll 的 Windows 用户界面 DLL
    中。
  • 在这个示例中,我们通过 DllImport 来调用 MessageBox 函数,它是 Windows API 中用于显示消息框的函数。

因此,这段代码的目的是从 user32.dll 中导入 MessageBox 函数,使得 C# 中的 Example 类可以调用这个非托管的 Windows API 函数,从而在应用程序中显示消息框。

三,总结

__declspec(dllexport) 和 DllImport 通常一起使用,前者用于在 DLL 中标记要导出的函数或变量,后者用于在客户端应用程序中标记要导入的函数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1149.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Swift-25-普通函数、闭包函数与Lamda表达式编程

函数 语法定义 先来看下swift中函数的定义&#xff0c;函数用关键字func来指定&#xff0c;语法相对复杂一点&#xff0c;主要有下列4种基本情况&#xff0c;还有比较复杂的&#xff0c;会在后续详细讲解。 无参函数定义 有参函数定义 一个简单的函数和函数调用示例如下&…

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测

分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测 目录 分类预测 | Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现SCSO-SVM沙猫群优化算法优化支持向量机多特征分类…

A1322 电烙铁发热芯热电偶温度与电压数据

就是这种四根线比较细的发热芯&#xff1a; 两根红色线是发热丝&#xff0c;另外两根是热电偶线&#xff0c;透明线是正极&#xff0c;不能搞错了。 非常粗略的测了一下&#xff0c;根本没有考虑误差。拿万用表直接测量热电偶的输出电压&#xff1b;用可调电源手动调节电压&am…

suse15 系统分区信息损坏修复案例一则

关键词 suse linux、系统分区fdisk、分区类型testdisk、grub2、bios There are many things that can not be broken&#xff01; 如果觉得本文对你有帮助&#xff0c;欢迎点赞、收藏、评论&#xff01; 一、问题现象 业务反馈一台suse服务器&#xff0c;因错误执行了fdisk分区…

TCP三次握手的原因

三次握手才可以阻止重复历史连接的初始化&#xff08;主要原因&#xff09;三次握手才可以同步双方的初始序列号三次握手才可以避免资源浪费为了确认双方的接收能力和发送能力都正常 为了实现可靠传输&#xff0c; 通信双方需要判断自己已经发送的数据包是否都被接收方收到&…

Linux 服务器硬件及RAID配置实战

服务器详解 服务器分类 可以分为&#xff1a;塔式服务器、机架服务器、刀片服务器、机柜服务器等。 其中以机架式居多 服务器架构 服务器品牌&#xff1a; 戴尔、AMD、英特尔、惠普、华为、华3&#xff08;H3C&#xff09;、联想、浪潮、长城 服务器规格&#xff1a; 规格…

【 C++ 】 讲解与实现 对数器接口

什么是对数器 说是叫对数器&#xff0c;但我觉得叫做核验器更好。 为什么&#xff1f;因为其作用是核验算法是否正确&#xff0c;所以我觉得叫核验器更好。 注意&#xff1a;本文实现的是生成只能int类型的对数器&#xff0c;其余类型不支持。 对数器的原理 对于一个核验器&am…

怎么用手机远程控制电脑 远程控制怎么用

怎么用手机远程控制电脑&#xff1a;远程控制怎么用 在这个科技日新月异的时代&#xff0c;远程控制电脑已经成为了很多人的需求。有时&#xff0c;我们可能在外出时突然需要访问家中的电脑&#xff0c;或者在工作中需要远程操控办公室的电脑。这时&#xff0c;如果能用手机远…

layui框架实战案例(27):弹出二次验证

HTML容器 <button class"layui-btn layui-btn-sm layui-btn-danger" lay-event"delete"><i class"layui-icon layui-icon-delete"></i>批量删除</button>删除封装函数 function delAll(school_id, school_name) {var lo…

Springboot+Vue项目-基于Java+MySQL的网上超市系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【信号处理】基于EEG脑电信号的自闭症预测典型方法实现

理论 自闭者主要受到遗传和环境因素的共同影响。由于自闭症是一种谱系障碍&#xff0c;因此每个自闭症患者都有独特的优势和挑战。自闭症患者学习、思考和解决问题的方式可以是高技能的&#xff0c;也可以是严峻的挑战。研究表明&#xff0c;高质量的早期干预可以改善学习、沟…

ZStack教育云计算解决方案入选高质量数字化转型技术解决方案集

近日&#xff0c;中国信通院“铸基计划”《高质量数字化转型技术解决方案&#xff08;2023年度&#xff09;》&#xff08;以下简称“方案集”&#xff09;发布&#xff0c;云轴科技ZStack智慧教育云计算解决方案入选《高质量数字化转型技术解决方案集》。 为促进数字化转型相…

第63天:服务攻防-框架安全CVE 复现DjangoFlaskNode.JSJQuery

目录 思维导图 案例一&#xff1a;JavaScript-开发框架安全-Jquery&Node node.js目录穿越 CVE-2021-21315命令执行 Jquery CVE-2018-9207 案例二&#xff1a;Python-开发框架安全-Django&Flask django cve_2019_14234 CVE-2021-35042 flask ssti 思维导图 案…

Cocos Creator 节点的相关组件介绍与组件化代码开发详解

前言 Cocos Creator 它基于 JavaScript 和 TypeScript&#xff0c;并且提供了可视化编辑器&#xff0c;让开发者可以快速创建游戏。在 Cocos Creator 中&#xff0c;节点是游戏中的基本元素&#xff0c;所有的游戏对象都是由节点组成的。节点可以包含各种组件&#xff0c;组件…

目标检测YOLO实战应用案例100讲-基于多尺度特征融合的水下小目标检测方法研究(中)

目录 基于自监督对比学习的水下目标检测方法 4.1基于自监督对比学习的水下目标检测

Jenkins和gitlab实现CICD

1 背景 在开发TracerBackend服务的时候&#xff0c;每次更改代码之后需要推送到gitlab&#xff0c;然后ssh登录到Ubuntu的服务器上部署新的代码。服务成功启动之后&#xff0c;在本地执行测试用例&#xff0c;觉得这一套操作流程还是挺复杂的。想起公司的代码发布流程&#xf…

OllamaFunctions 学习笔记

OllamaFunctions 学习笔记 0. 引言1. 使用方法2. 用于提取 0. 引言 此文章展示了如何使用 Ollama 的实验性包装器&#xff0c;为其提供与 OpenAI Functions 相同的 API。 1. 使用方法 您可以按照与初始化标准 ChatOllama 实例类似的方式初始化 OllamaFunctions&#xff1a; …

多模态视觉语言模型:BLIP和BLIP2

1. BLIP BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation BLIP的总体结构如下所示&#xff0c;主要包括三部分&#xff1a; 单模态编码器&#xff08;Image encoder/Text encoder&#xff09;&#xff1a;分别进…

智慧浪潮下的产业园区:解读智慧化转型如何打造高效、绿色、安全的新产业高地

随着信息技术的飞速发展&#xff0c;智慧化转型已经成为产业园区发展的重要趋势。在智慧浪潮的推动下&#xff0c;产业园区通过集成应用物联网、大数据、云计算、人工智能等先进技术手段&#xff0c;实现园区的智慧化、高效化、绿色化和安全化&#xff0c;从而打造成为新产业高…

(四)SQL面试题(连续登录、近N日留存)学习简要笔记 #CDA学习打卡

目录 一. 连续登录N天的用户数量 1&#xff09;举例题目 2&#xff09;分析思路 3&#xff09;解题步骤 &#xff08;a&#xff09;Step1&#xff1a;选择12月的记录&#xff0c;并根据用户ID和登录日期先去重 &#xff08;b&#xff09;Step2&#xff1a;创建辅助列a_rk…