分享如何在VB中调用VC编写的DLL_vb

一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法。
先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明前加上__stdcall关键字。如:
short __stdcall sample(short nLen, short *buffer)
要做到第二条,需要在*.def文件中加上如下的几行:

EXPORTS
sample @1
这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer
这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:
sample 10, a(0)
这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃

1. 调用DLL的优越性

  动态链接库(DLL)作为Windows操作系统的基础,具有优越的应用性能:
  DLL扩展了应用程序的特性。由于DLL能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。
  DLL可以用多种语言进行编写。例如用VB来编写应用程序的界面,而用C++来编写诸如算法、通讯之类的底层操作。
  DLL简化了软件项目的管理。如果在软件开发过程中不同的工作小组在不同的模块上工作,那么这个项目管理起来比较容易。
  DLL有助于节省内存。如果两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入RAM一次,所有的应用程序都可以共享它的各个页面。
  DLL有助于资源的共享。DLL可以包含对话框模板、字符串、图标和位图等资源,多个应用程序能够使用DLL来共享这些资源。
  DLL有助于应用程序的本地化。例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的DLL 。
  DLL有助于解决平台差异。不同版本的Windows配有不同的函数,开发人员常常想要调用新的函数。但是,如果源代码包含了对一个新函数的调用,而应用程序将要在不能提供该函数的Windows版本上运行,那么操作系统的加载程序将拒绝运行该进程。如果将这些新函数保存在DLL中,那么应用程序就能够将它们加载到Windows的老版本上,就可以成功地调用该函数。

2.找到DLL的入口点

  初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。这主要是由以下疏漏造成的。
  首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。
  其次,在DLL的.def文件中必须加上入口函数。
  最后,在函数定义前必须加上extern "c",_stdcall关键字。
  具体格式可参看应用实例。

3.数组参数在DLL中的传递

  由于DLL经常用来进行一些底层的运算操作,因此应用程序常需要传递大量的数据给DLL。在C++中,指针是进行数组操作的最佳选择,但VB中没有指针的概念。这通常可用两种方法来解决。
  其一,在VB中声明DLL时,用byref来代替byval,即可将数组指针传递给DLL。
  另外,将数组声明为变体型(variant),即可直接将数组传递给DLL。

4.应用实例

  以下通过一具体实例来说明在VB中调用VC环境下创建的DLL的过程。
  创建一用于信号处理的DLL,"SigPro.dll",其中有一个用于富氏计算的函数"Fourier"。

VC中的声明:

在"SigPro.h"中加入以下代码,

复制代码 代码如下:

extern "C"
{
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);
}
在"SigPro.cpp"中加入以下代码,
extern "C"
double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos)
{
int i;
double result=0.0;

if(SinOrCos==true)
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*cos(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
else
{
for(i=0;i<NumSam;i++)
{
result=result+*(Sample+i)*sin(OvertoneOrder*i*2*3.1415926/NumSam);
}
}
result =result*2/NumSam;
return result;
}

在"SigPro.def"中加入以下代码,
  EXPORTS
  Fourier

VB中的调用声明:
  Public Declare Function Fourier Lib "SigPro" (ByRef Sample() As Long, ByVal NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boolean) As Double

时间: 2024-06-13 13:17:01

分享如何在VB中调用VC编写的DLL_vb的相关文章

在VB中调用CHM 帮助的几种方法

在VB中调用CHM 帮助的几种方法 一个应用程序不论编制得如何完美,在很多情况下用户还是会对如何使用它提出问题. Visual Basic 提供了对两种不同帮助系统的支持:传统的 Windows 帮助系统 (WinHelp)和新的 HTML 帮助(CHM帮助).当我们制作好帮助文件后,就需要在程序的适当位置编写代码进行调用,本文将讨论几种在程序中调用CHM帮助文件的方法. 方法一 使用F1键:这种方法最简单,只需如下代码即可:Private Sub Form_Load() App.HelpFil

如何在Delphi中调用VC6.0开发的COM

上次写了如何在VC6.0下对Delphi写的COM进行调用,原本想马上写如何在Delphi中调用VC6.0开发的COM时,由于在写事例程序中碰到了个很怪的问题,在我机子上用VC写的接口程序编译能通过.但是调用就会出现问题,(在VC下调用也是一样的出现).但是用Delphi写的接口程序编译后,不管是在VC下还是在Delphi下调用都没有问题.后来我把VC开发的接口程序编译后,拷贝到其它机子上试,怪事,完全没有问题了.总结后才知道是我机子有点问题.我到现在还没有解决为什么在我的机子上不行,在其它机子

debug-如何在Qt中调用Python

问题描述 如何在Qt中调用Python 在网上有c++(vs环境下和vc++环境下)调用python的方法,但是我现在用Qt开发一个Python的debugger,有些东西必须要使用Python本身的东西,所以必须要在Qt中调用python.现在向各位大牛们求助,希望大家帮帮忙,要不毕设就死定了... 发一下我找到的几个帖子:http://wenku.baidu.com/link?url=M3K_27I8yLSHXKWOVbpoyD15Tqys271gqvLHFdPgJt4uaiUeeXcbIt

c-计算器程序:如何在Qt5中使用C编写科学计算器程序?

问题描述 计算器程序:如何在Qt5中使用C编写科学计算器程序? 如何在Qt5中使用C编写科学计算器程序?最好可以直接是不需要GUI,有程序生成界面的C++程序 解决方案 使用C编写科学计算器程序,你有源代码吗?如果有,移植一下应该不难.如果没有,就算了吧,自己写一个类似功能的:或者,网上下载计算器功能的源代码,做移植修改. 如果原来的程序,不提供非 GUI 调用的接口,那么就只能使用它的 GUI. 解决方案二: 在这个csdn论坛里面有好多关于计算器的源代码,你自己看一下

实例学习如何在ASP中调用DLL

本文通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程,向大家介绍如何在ASP中调用DLL的文章专题. 动态联接库(DLL)是加快应用程序关键部分的执行速度的重要方法,但有一点恐怕大部分人都不知道,那就是在ASP文件也能通过调用DLL来加快服务器的执行速度,下面我简单的介绍一下在ASP文件调用DLL的步骤.  首先,必须得有DLL文件,本例是通过VB5.0创建ActiveX DLL文件,这个文件模拟了一个掷色子的过程.  在VB5.0的环境下,新建一个工程,并双击新建工

在网页中调用VC写的对话框

要想在网页中调用VC写的对话框,那就得创建一个OCX了,下面将一步一步教你怎么写OCX: 第一步选择"MFC ActiveX ControlWizard",写入创建工程的名字,然后一路狂按"NEXT",直到"Finish",至此一个简单的MFC型的OCX框架已完成了; 第二步在资源中添加一对话框,并创建一个对话框的新类; 第三步就得为OCX添加方法了,见图:ClassWizard->Add Method,选择OK: 接着给方法添加以下代码:

VB中调用Word拼写检查

VB 中调用 Word 拼写检查 Function CheckSpell(IncorrectText as string) as stringDim Word As Object, retText$On Error Resume Next' 建立对象并打开 WORDSet Word = CreateObject("Word.Basic")' 把需要检查的 STRING 放到 WORDWord.AppShowWord.FileNewWord.Insert IncorrectText' 运

数据库-如何在vfp中调用某一特定word文档的邮件合并功能?

问题描述 如何在vfp中调用某一特定word文档的邮件合并功能? 如下操作应该怎么实现? 已经做好了一个需要邮件合并的word模板,插入了合并域,引用了vfp数据库中的数据, 在VFP中通过表单录入数据存入数据库, 将刚才录入的数据通过一个vfp的程序或命令在word文档中进行邮件合并生成需求的文档然后保存到指定位置. 想做这样一个东西,可是最后一步里不知道怎么写.

qt gui-如何在qtdesigner中调用并修改图片

问题描述 如何在qtdesigner中调用并修改图片 选择文件路径并展示QAQ求大神指点,用qt designer实现 解决方案 图片先添加到资源里面(工程右键--添加新文件--Qt--Qt Resource File)然后可以用styleSheet来设置,比如: border-image: url(:/new/login/login.png); 解决方案二: 图片修改