动态链接库(dll)的好处就不多说了,这里就把如何在VB中调用VC写的dll函数的方法介绍一下,供有需要的朋友们参考,同时也免得自己以后忘了。

初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。这主要是由以下疏漏造成的。

首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。

其次,在DLL的.def文件中必须加上入口函数。

最后,在函数定义前必须加上extern "c",_stdcall关键字。

其中 _stdcall 是一种函数的调用约定,有关函数的调用约定可以参考文章

比如现在做一个求数组中所有元素的和的函数,完整代码如下

DLL_test_dll.h中的代码

extern "C"

{

int _stdcall sum(int len,int* a);

}

DLL_test_dll.cpp中的代码,红色部分为自己写的代码,其余的为系统自动生成

// DLL_test_dll.cpp : 定义 DLL 应用程序的入口点。

//

#include "DLL_test_dll.h"

#include

using namespace std;

#ifdef _MANAGED

#pragma managed(push, off)

#endif

BOOL APIENTRY DllMain( HMODULE hModule,

DWORD  ul_reason_for_call,

LPVOID lpReserved

)

{

return TRUE;

}

#ifdef _MANAGED

#pragma managed(pop)

#endif

extern "C"

int _stdcall sum( int len,int* a )

{

int result = 0;

for ( int i = 0;i

{

result = result+a[i];

}

return result;

}

还要在工程中添加一个 def 文件来指定导出的函数,这个直接在VC中新建文件就可以,扩展名是  .def

DLL_test_dll.def文件中的内容为

LIBRARY "DLL_test_dll"

EXPORTS

sum  @1

把上面的代码都写好后编译就可以生成  .dll   和  .lib  文件了,下面是说如何在VB中调用并传递数组参数

首先在VB中声明dll中的函数,名字要和dll中的函数名一致,至于变量类型这个没法对应,毕竟是两种语言,不过要注意的是变量数量和变量大小应该是对应的,比如现在在C语言中 int 型是 4 字节,在VB中就要用 Integer 型来对应,函数声明方法如下

Public Declare Function sum Lib "E://Study//VB//DLL_test_dll//Debug//DLL_test_dll.dll" (ByVal a As Integer,ByRef b As Integer) As Integer

以上代码是在一行中写的

与一般函数生命的不同之处就是多了一个 Declare ,Function 后面的 sum 就是函数名,要与dll中一致,Lib 是指定dll地址的,推荐用全路径地址,不过如果只写一个名字并把dll跟程序放在一个目录下的话应该也可以,这个没试过

注意到上面参数定义的红色的 ByRef 关键字,VB中函数参数的传递有两种方式,一种是传值,就是前面那个 ByVal,另一种就是传地址,就是这里用的 ByRef,由于我们想传递数组参数,所以要用 ByRef 方式传递

函数定义完了具体要如何调用呢,请看下面的例子

Dim a As Integer      '定义一个整数,作为数组长度

Dim b(1) As Integer   '定义一个有两个数的数组,其中的1代表数组下标上界,这里与C语言是不同的

Dim c As Integer      '顶一个整数存放结果

a = 2

b(0) = 17

b(1) = 11

c = sum(a, b(0))

这里可能有点令人费解,我明明应该传数组的地址,怎么传了个 b(0) 过去呢?

这里要说的是在 C/C++ 语言中数组的地址和第一个元素的地址是相同的,VB语言中 ByRef 方式直接传递的就是参数的地址,综合上面两条就可以知道这个语句实际传递的就是数组 b 中第一个元素 b(0) 的地址,这样就完成了从VB中向dll数组参数参数的传递

参考文章:

vb与c语言数组传递,在VB中调用C/C++语言编写的dll,数组参数的传递相关推荐

  1. python中定义一个类、实例化时传入的参数如何传递_用实例分析Python中method的参数传递过程...

    什么是method? function就是可以通过名字可以调用的一段代码,我们可以传参数进去,得到返回值.所有的参数都是明确的传递过去的. method是function与对象的结合.我们调用一个方法 ...

  2. 不属于c语言程序运算符,以下选项中不属于C语言程序运算符的是( )

    参考答案如下 点击查看答案 ()是党的一项极端重要的工作,下C语言程关乎旗帜.关乎道路.关乎国家政治安全,决定文化前进方向和发展道路. 选项序运消费税计算应纳税额的计算方法不包括( ) 属于算符下列哪 ...

  3. go 调用winapi_如何在go中调用windows api-Go语言中文社区

    1.cgo环境搭建 初入go坑,记录一次工作中需要封装windows api 的过程.既然是go调用C++那么首先要配置cgo的环境了.要使用CGO特性,需要安装C/C++构建工具链,在macOS和L ...

  4. C语言程序可以放到qt,初学Qt之--在Qt中调用外部C语言模块

    调用外部已编译好的C语言模块,传递参数并将结果返回打印出来. C语言模块代码: /**********Test.c**********/ /**********用gcc编译后生产那个的可执行文件tes ...

  5. c语言将数据写入mysql中_用C语言操作MySQL数据库

    先看结构体 ---------------------------------------------- 以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql ...

  6. oracle的脚本语言是什么意思,Oracle中的sql脚本语言中的循环语句介绍

    --sql脚本语言的循环介绍: --1.goto循环点. declare x number; begin x:=0;--变量初始化: <>--设置循环点. x:=x+1; dbms_out ...

  7. c语言结构体在内存中的存储,C语言结构体在内存中的存储情况探究------内存对齐...

    条件(先看一下各个基本类型都占几个字节): voidsize_(){ printf("char类型:%d", sizeof(char)); printf("int类型:% ...

  8. python语言结构化语言_如何在python中处理结构化语言文件

    我有一个像这样的大型结构化语言文件:TASK SchM_Task { TYPE = AUTO; SCHEDULE = NON; PRIORITY = 160; ACTIVATION = 1; TIMI ...

  9. C语言程序中调用脚本,C语言调用SHELL脚本

    在Linux 环境下Shell脚本具有非常强大的功能!使用Shell可以很方便的使用和管理Linux系统,最近学习了一点shell知识,所以一直在 想要是可以在C/C++中调用shell脚本那该有多 ...

  10. c语言syscall函数,在C中调用syscall函数时出现问题

    为了完成家庭作业,我必须修改linux内核. 我在一个虚拟机上工作,我向内核添加了一个系统调用,我称之为get_unique_id.以下是get_unique_id.c的代码:#include #in ...

最新文章

  1. [转载红鱼儿]kbmmw 开发点滴:kbmMW:Unknown property:indexes
  2. [JSP暑假实训] 三.MySQL数据库基本操作及Servlet网站连接显示数据库信息
  3. golang 新手练习 go语言 10分钟练习贴
  4. delphi 7 学习步骤
  5. 罗永浩“卖艺”还债能成?邀约不断,币圈抢着送钱
  6. Linux下的web调度器——squid实现(负载均衡)
  7. 物联网卡11位和13位号码的区别在于哪
  8. CLRS2e读书笔记—Chapter10
  9. 【计算机组成原理习题(2023王道考研 )】-- 第一章 计算机系统概述(选择+简答)
  10. 油管机器学习基础 学习笔记
  11. [Docker Swarm集群+图形化界面Visualizer笔记记录]
  12. 第一篇 Qt能做什么?
  13. python如何回退_Pycharm技巧之代码跳转该如何回退
  14. 基于pandas、matplotlib、pyecharts的人工智能相关职位招聘市场数据分析
  15. oracle10g搭建,Oracle 10g环境的搭建手册
  16. python之无限浏览网页
  17. 谈谈分布式服务治理框架 Dubbo 重大升级
  18. 1学习react 第一章创建react项目
  19. Nginx 理论+实例超详细讲解
  20. 时间戳转换、BASE64和MD5加解密、秒表、图片进行BASE64转换离线使用小工具

热门文章

  1. 互联网金融革命已让银行家们彻夜难眠
  2. SAP GUI登陆系统报Validity of certificate from list with PSE type >SSL错误弹窗
  3. 记录百度点击登录无响应及百度搜索显示异常
  4. 常威来了(变量和常量)简单易懂
  5. 如何通过知识付费盈利,实现内容变现?
  6. PG如何影响数据分布
  7. 安卓终端模拟器运行PHP,ROOT用户福利:安卓终端模拟器简述及命令行入门!
  8. HIVE报错:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedTask
  9. i12蓝牙耳机怎么设置成中文_耳朵里的小精灵——乐迈车载智能蓝牙耳机
  10. mysql32位的能装在64位的电脑上吗_32位电脑能装64位系统吗|怎么看32位电脑可不可以装64位系统-系统城...