当前位置: 首页 > news >正文

VB.net调用VC DLL

函数的修饰名?参考文献12

.DEF导出和__declspec(dllexport)的优缺点?参考文献11

1、__declspec(dllexport)

可以使用 __declspec(dllexport) 关键字从 DLL 中导出数据、函数、类或类成员函数。

尝试导出已修饰的 C++ 函数名称时,这种便利性最为明显。

生成 DLL 时,通常会创建一个包含要导出的函数原型和/或类的头文件,并将 __declspec(dllexport) 添加到头文件中的声明内。

若要指定 C 链接,请为函数声明指定 extern "C"

2、 DEF 文件 (*.def)

模块定义或 DEF 文件 (*.def) 文件是文本文件,其中包含一个或多个描述 DLL 的各种特性的模块语句。 如果没有使用 __declspec(dllexport) 关键字来导出 DLL 的函数,则 DLL 需要 DEF 文件。

LIBRARY BTREE

EXPORTS

Insert @1

Delete @2

Member @3

Min @4

如果使用 MFC DLL 向导创建 MFC DLL,则向导将为你创建主干 DEF 文件,并自动将它添加到项目中。 添加要导出到此文件的函数的名称。 对于非 MFC DLL,请自己创建 DEF 文件并将它添加到项目。 然后转到“项目”>“属性”>“连接器”>“输入”>“模块定义文件”,并输入 DEF 文件的名称。

如果要导出 C++ 文件中的函数,则必须将修饰名放置在 DEF 文件中,或使用 extern "C" 通过标准 C 链接定义导出函数。

3、VB.net调用VC DLL

若要使 Visual Basic 应用程序(或诸如 Pascal 或 Fortran 等其他语言编写的应用程序)调用 C/C++ DLL 中的函数,必须使用正确的调用约定导出函数,而无需编译器进行任何名称修饰

__stdcall 为函数创建正确的调用约定(被调用的函数会清理堆栈,且参数从右向左传递),但以不同方式修饰函数名称。因此,当对 DLL 中的已导出函数使用 __declspec(dllexport) 时,导出修饰名。

__stdcall关键字将使限定(extern "C" )无效
如果没有添加__stdcall关键字,那么函数调用约定为C调用约定。如果加了__stdcall标准调用约定,就是WINAPI调用约定,也就是pascal调用约定,这种约定与C调用约定不一样。
如果EXPORTS下的函数个数多时,方式为:

LIBRARY “dlll”
EXPORTS
ADD
SUB
MUL

因为无法替代发生堆栈清理的位置,所以必须使用 __stdcall。 若要使用 __stdcall 取消修饰名称,必须通过在 .def 文件的 EXPORTS 部分中使用别名来指定它们。

__stdcall 名称修饰使用下划线字符 () 作为符号名称的前缀,并向符号追加 at 符号 (@),后跟参数列表中的字节数(所需堆栈空间)

对于以下函数声明,这会显示如下

int __stdcall MyFunc (int a, double b);

void __stdcall InitCode (void);

在 .DEF 文件中:
EXPORTS
   MYFUNC=_MyFunc@12
   INITCODE=_InitCode@0

别名和@参数都是可选的

若要使 Visual Basic 编写的程序可调用 DLL,.def 文件中需要本主题中所示的别名技术。 如果别名在 Visual Basic 程序中完成,则不需要在 .def 文件中使用别名。

参考文献

1、https://www.cnblogs.com/hdsong/p/5683960.html

2、VB如何调用DLL_vba dll vb-CSDN博客

3、https://www.cnblogs.com/dtblog/p/4847737.html

4、https://wenku.csdn.net/answer/2x4fr7yuov

5、在VB中调用C/C++语言编写的dll,数组参数的传递_vb调用外部dll type 传参-CSDN博客

6、VB.net中调用C\C++ 的DLL_vb6 调用c++ net 调用c++-CSDN博客

7、用VC开发API形式的DLL给VB调用的范例_vc6使用c语言编写dll给vb6调用-CSDN博客

8、使用 DEF 文件从 DLL 导出 | Microsoft Learn

9、使用 __declspec(dllexport) 从 DLL 导出 | Microsoft Learn

10、导出 C++ 函数以用于 C 语言可执行文件 | Microsoft Learn

11、确定要使用的导出方法 | Microsoft Learn

12、DLL导出函数名称改编的解决方法_修改dll导出函数名称-CSDN博客


 

相关文章:

  • 实战 | 基于YOLOv10的车辆追踪与测速实战【附源码+步骤详解】
  • 智慧工厂监控可视化解决方案(160页WORD)
  • 从零开始学GeoServer源码(一)(搭建开发环境Win10+IDEA23.3.5+jdk11+geoserver2.24.x)
  • Zenity向Ubuntu系统发送通知
  • 安全测试入门基础大全。。费了大功夫整理(超级全面)
  • [AIGC] Java List接口详解
  • 从0到1实现YOLOv3
  • linux在文件夹中查找文件内容
  • MySql 数据库、表常用语句
  • 微软如何打造数字零售力航母系列科普13 - Prime Focus Technologies在NAB 2024上推出CLEAR®对话人工智能联合试点
  • 短URL服务设计
  • onnx基本概念
  • .gitignore文件忽略的内容不生效问题解决
  • 车载学习:UDS诊断、ECU刷写、OTA升级、Tbox测试、CANoe实操
  • 通过Vue3+高德地图的JS API实现市区地图渲染
  • 网络传输文件的问题
  • 分享一款快速APP功能测试工具
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • 2017-09-12 前端日报
  • Apache Pulsar 2.1 重磅发布
  • Apache的基本使用
  • Bootstrap JS插件Alert源码分析
  • CSS 提示工具(Tooltip)
  • EventListener原理
  • HashMap剖析之内部结构
  • iOS 系统授权开发
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • 初识 webpack
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 每天一个设计模式之命令模式
  • 盘点那些不知名却常用的 Git 操作
  • 让你的分享飞起来——极光推出社会化分享组件
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 做一名精致的JavaScripter 01:JavaScript简介
  • Android开发者必备:推荐一款助力开发的开源APP
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云ACE认证学习知识点梳理
  • ​卜东波研究员:高观点下的少儿计算思维
  • ${factoryList }后面有空格不影响
  • (pojstep1.3.1)1017(构造法模拟)
  • (三)elasticsearch 源码之启动流程分析
  • (十七)Flask之大型项目目录结构示例【二扣蓝图】
  • (十一)图像的罗伯特梯度锐化
  • (四) Graphivz 颜色选择
  • (推荐)叮当——中文语音对话机器人
  • (万字长文)Spring的核心知识尽揽其中
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)Linq学习笔记
  • (转)socket Aio demo
  • (转)详解PHP处理密码的几种方式
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .class文件转换.java_从一个class文件深入理解Java字节码结构
  • .Net 4.0并行库实用性演练
  • .net 4.0发布后不能正常显示图片问题
  • .net framework4与其client profile版本的区别