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博客


 

相关推荐

  1. How to find which Azure Private DNS Zone is associated with VNet

    2024-06-11 09:28:02       16 阅读
  2. JVM指令:方法调用之解析调用

    2024-06-11 09:28:02       13 阅读
  3. thinkphp控制器调用脚本

    2024-06-11 09:28:02       36 阅读
  4. linux系统调用介绍

    2024-06-11 09:28:02       40 阅读
  5. OpenFeign远程调用实例

    2024-06-11 09:28:02       32 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-11 09:28:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-11 09:28:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-11 09:28:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-11 09:28:02       20 阅读

热门阅读

  1. 程序员如何高效挖掘市场需求

    2024-06-11 09:28:02       9 阅读
  2. MyEclipse 新手使用教程

    2024-06-11 09:28:02       11 阅读
  3. adb 脚本化Android系统截图和录屏

    2024-06-11 09:28:02       8 阅读
  4. 记一次大量CSV数据文件同步到数据库

    2024-06-11 09:28:02       7 阅读
  5. go_compiler

    2024-06-11 09:28:02       4 阅读
  6. 平均召回(Average Recall,AR)概述

    2024-06-11 09:28:02       11 阅读
  7. 细说wayland和X11

    2024-06-11 09:28:02       7 阅读
  8. 详细说说机器学习在工业制造的应用

    2024-06-11 09:28:02       8 阅读
  9. STM32 ST-LINK Utility的下载安装使用说明如下:

    2024-06-11 09:28:02       12 阅读