荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 在VB应用程序中调用VC环境下开发的DLL
发信站: 荔园晨风BBS站 (Wed Jun  6 06:58:46 2001), 转信

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",其中有一个用于富氏计算的函数"Four
ier"。
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, By
Val NumSam As Integer, ByVal OvertoneOrder As Integer, ByVal SinOrCos As Boo
lean) As Double

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店