VB.net调用VC DLL

2024-06-10 23:36
文章标签 vb net vc dll 调用

本文主要是介绍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博客


 

这篇关于VB.net调用VC DLL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1049588

相关文章

vcpkg安装opencv中的特殊问题记录(无法找到opencv_corexd.dll)

我是按照网上的vcpkg安装opencv方法进行的(比如这篇:从0开始在visual studio上安装opencv(超详细,针对小白)),但是中间出现了一些别人没有遇到的问题,虽然原因没有找到,但是本人给出一些暂时的解决办法: 问题1: 我在安装库命令行使用的是 .\vcpkg.exe install opencv 我的电脑是x64,vcpkg在这条命令后默认下载的也是opencv2:x6

Windows中,.net framework 3.5安装

安装.net framework,目前已知2种方法,如下: 一、在MSDN下载对应的安装包,安装,这种可能无法安装成功,概率很大,不成功使用第二种方法,基本上没问题。 二、win8/8.1/10 下安装 .net framework 3.5.1: 1. 打开 win8/8.1/10 安装盘(这里指系统安装镜像文件),提取 sources\sxs 文件夹到 X:\sources\sxs (X代

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(ActionMethods)的概念、通过路由配置将请求映射到相应的方法上。 开发人员可以使用各种属性和过滤器来处

ScrollView 非手动调用的方法

1. /**  *  非人为的时候调用这个方法  *  *  @param scrollView <#scrollView description#>  */ - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {           } 2.判断控制器的view是否加载过 [willShowVC

【ASP.NET】 No 'Access-Control-Allow-Origin' header is present on the requested resource.

前端JS用XMLHttpRequest,请求后端数据。出现了No ‘Access-Control-Allow-Origin’ header is present on the requested resource. 我是使用的ASP.NET框架。 解决办法: 在Web.config文件相应地方添加: <?xml version="1.0" encoding="utf-8"?><confi

msvcp140.dll丢失的解决方法,msvcp140.dll丢失下载办法

一、msvcp140.dll丢失或损坏的影响 系统更新影响 系统更新是导致msvcp140.dll丢失或损坏的常见原因之一。在自动更新过程中,可能会引入与现有应用程序不兼容的DLL版本,从而引发错误。根据用户反馈和技术支持数据,大约15%的msvcp140.dll问题与系统更新有关。 恶意软件攻击 恶意软件通过删除或损坏系统文件来破坏计算机功能,msvcp140.dll是其攻击目标之一。安

vue dist文件打开index.html报Failed to load resource: net::ERR_FILE_NOT_FOUND

本地正常。打包好的dist文件打开index.html报Failed to load resource: net::ERR_FILE_NOT_FOUND 解决办法: 在webpack.prod.conf.js 中output添加参数publicPath:’./’ 在webpack.base.conf.js里 publicPath: process.env.NODE_ENV === ‘pro

在WinCE的C#编程中,需要静态调用C++的动态库,需要添加using System.Runtime.InteropServices

using System.Runtime.InteropServices;         [DllImport("Win32DLL.dll", EntryPoint = "WriteREG_SZToRegTCHAR")]         private static extern bool WriteREG_SZToRegTCHAR(int iFlag, string regKeyP

导入别人的net文件报红问题sdk

1. 使用cmd命令 dotnet --info 查看自己使用的SDK版本 2.直接找到项目中的 global.json 文件,右键打开,直接修改版本为本机的SDK版本,就可以用了

PHP中静态(static)调用非静态方法详解

1.PHP中可以静态调用非静态方法么? 今天我被问到PHP中可不可以使用 className::methodName() 的方法来调用一个没有声明static的方法。在我的印象中,我好像是见过这种用法,但又有些不确定。大家都知道,在手册或者教程里,方法被分为静态方法 和非静态方法,通常我们静态调用的方法,肯定是静态方法。 那如果我们调用了非静态方法会怎么样呢?首先做测试。 1