__declspec(dllexport)(转)

2023-10-27

__declspec(dllexport)(转)

转自:http://hi.baidu.com/jk_cau/blog/item/43f7e6b3b3082da1d9335abe.html

一、__declspec(dllexport):

        将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

       通常它和extern    "C"   合用,形式如下:

extern "C"
{
__declspec(dllexport) RETURN_TYPE FUNCTION()
{
}
}
       这是由于在制作DLL导出函数时由于C++存在函数重载,因此__declspec(dllexport)    FUNCTION(int,int)    在DLL会被decorate,例如被decorate成为    function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址时的不便,使用extern    "C"时,上述的decorate不会发生,因为C没有函数重载,如此一来被extern"C"修饰的函数,就不具备重载能力。

二、以下内容摘自MSDN:

“在 32 位编译器版本中,可以使用__declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport)将导出指令添加到对象文件(即obj文件),若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:

__declspec(dllexport) void __cdecl Function1(void);

若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:

class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };

生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将__declspec(dllexport)添加到头文件中的声明。
若要提高代码的可读性,请为__declspec(dllexport)定义一个宏并对正在导出的每个符号使用该宏:
#define DllExport   __declspec( dllexport ) ”

三、__declspec(dllexport) 与 .def

模块定义 (.def) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。
1、二者的目的都是将公共符号导入到应用程序中或从 DLL 导出函数。
2、添加 __declspec(dllexport)是为了提供不使用.def文件从 .EXE 或 .DLL 导出函数的简单方法。
3、如果不使用 __declspec (dllimport) 或 __declspec(dllexport) 导出 DLL 函数,则 DLL 需要.def文件。
4、并不是任何时候选择添加 __declspec(dllexport)而放弃.def的方式都是好的。如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport) 声明的函数会进行名称转换,如下面的函数: 
     __declspec(dllexport) int __stdcall IsWinNT() 
     会转换为IsWinNT@0,这样你在VB中必须这样声明: 
     Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long 
     @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

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

__declspec(dllexport)(转) 的相关文章

随机推荐

  • python处理excel词频统计

    import pandas as pd import jieba from collections import Counter 读取 Excel 文件 df pd read excel your excel file xlsx 定义函数用
  • 爬虫学习:实现对彼岸图4k图片的下载

    在学习python爬虫一段时间后 进行第一个项目的实践 本文使用的库为 requests库 time库 xpath库 os库 目的 实现对彼岸图4k图片的下载 源码 import requests import time from lxml
  • CentOS7安装MySQL8.0图文教程

    1 下载 MySQL 所需要的安装包 网址 https dev mysql com downloads mysql 2 Select Operating System 选择 Red Hat CentOS 是基于红帽的 Select OS V
  • R手册(Tidy+Transform)--forcats

    forcats 分类变量数据处理 forcats for factor 函数 说明 factor x levels labels ordered as factor x fct expand f 添加更多级别 fct explicit na
  • Android RecyclerView 上下/左右 禁止滑动

    禁止滑动 禁止竖向滑动 和 禁止横向滑动 线性布局 禁止滑动 Java 禁止滑动 布局管理器 LinearLayoutManager linearLayoutManager new LinearLayoutManager this 禁止竖向
  • Cadence新建仿真文件出现Cannot Initialize Profile错误的解决方法和步骤

    元器件和器件PSpice模型都准备好了 仿真原理图也画好了 但是在新建仿真配置文件的时候 提示Cannot Initialize Profile的错误 当时忘了截图了 问题解决了也没有出现这个错误 重启软件 重启电脑都没有再出现 因为之前都
  • C++构造函数和析构函数能否继承

    前段时间 一个同事问了一个问题 C 类中的构造函数析构函数派生的子类能否继承 这个问题以前真的没有注意过 按道理来讲应该说可以的 但是本着求证的态度写了一段测试代码 include
  • java 实体转json null不过滤

    import com alibaba fastjson JSONObject JSONObject toJSONString java实体 SerializerFeature WriteMapNullValue
  • ubuntu下解决wireshark权限问题

    wireshark要监控eth0 但是必须要root权限才行 但是 直接用root运行程序是相当危险 也是非常不方便的 解决方法如下 1 添加wireshark用户组 sudo groupadd wireshark 2 将dumpcap更改
  • gzip: stdin: not in gzip format tar: Child returned status 1 tar: Error is not recoverable: exiting

    1 报错描述 使用centos安装jdk 在解压的时候出现了这个问题 原因是我复制的下载链接是还没有点击同意协议后复制的 2 错误解决 在点击下载按钮后 会弹出一个框 让你同意后下载 点击同意 然后复制跳转下载的链接 便可解决问题 可以看到
  • Python import自定义模块报错、自定义异常、字符串处理、截取

    一 python import自定义的模块报错 问题现象 pycharm中运行一切正常 但是到命令行中 cmd命令行或pycharm的Terminal窗口 运行py文件 就会报错No module named xxx 问题原因 pychar
  • 二分查找的两种方法(详细图解)

    一 什么是二分查找 假设给定的数组中的元素是一个有序的状态 比如是单调不递减或者是单调不递增的状态 对于这种情况可以使用二分查找来完成 即二分查找需要满足两个条件 1 数组存储 2 元素有序 单调性 二 时间复杂度 比如 总共有n个元素 每
  • mysql 互换两行数据中的一个值(排序互换)

    需求 实现列表排序互换功能 每次排序向上加一或向下减一 使排序号互换 分析 要达到这种需求 首先要拿到主动排序数据和被动排序数据两条数据进行更新 这样的话 仅从拿到的排序值处理 要进行多次查询和更新 不想做频繁的查询更新操作 想着能使用一条
  • vtk学习笔记 --- 判断三角形相交

    在使用三角网连接矿体的时候 需要判断当前连接的三角形和已经连接的三角形是否相交 所以 就需要进行三角形相交判断 看了一些算法的文章 两个三角形相交的判断规则大体如下 假设这两个三角形为A a1 a2 a3 B b1 b2 b3 三角形A所在
  • 创建一个简单的定时任务示例demo

    废话不说直接上代码 controller Controller EnableScheduling public class SchedulingUtil Autowired private ceshi ceshi private stati
  • 简单粗暴解决$emit第一次传值不成功问题

    兄弟页面间传值用 e m i t 发 送 emit发送 emit发送 on接收 但是如果是跳转页面 A页面发送数据跳转到B
  • Springboot + mybatis 调试Console控制台 打印SQL语句

    Springboot mybatis Console控制台 打印SQL语句 有的时候项目查不出数据或者数据出现错误 这时候需要看看SQL语句是否有错 于是就用下面的配置信息 打印SQL语句 如果使用的是application propert
  • Java几种文件复制的实现测评

    Java几种文件复制的测评 前言 Java复制文件的实现方式有很多种 IO模式下 1 FileInputSTream FileOutputStream 2 BufferedReader BufferedWriter 采用readLine方法
  • mysql数据库----时间和日期类型

    为了方便在数据库中存储日期和时间 MySQL提供了表示日期和时间的数据类型 分别是YEAR DATE TIME DATETIME和TIMESTAMP 表3 4列举了这些MySQL中日期和时间数据类型所对应的字节数 取值范围 日期格式以及零值
  • __declspec(dllexport)(转)

    declspec dllexport 转 转自 http hi baidu com jk cau blog item 43f7e6b3b3082da1d9335abe html 一 declspec dllexport 将一个函数声名为导出