【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“VB调用C - 编程语言“提供大家参考,希望对大家有所帮助!
摘 要 文中介绍了一种实现
VB调用C语言程序的方法动态连接库法给出了动态链接库制 作的一般框架通过实例描述了动态连接库的实现及其制做方法、编程步骤这种方法具有 普遍的意义。
关键词
VB 动态连接库DLL C程序 一、引言 Visual Basic 以下简称
VB是一种可视化的面向对象的编程语言以其编程简单、快捷 等特点深受广大WINDOWS程序员的青睐。
利用
VB开发界面友好、操作方便的
软件只需很短的时间。
但是
VB运行速度较慢对于庞大的科学计算
问题
VB的这种慢速会使人难以忍受。
C语言是国际上非常流行的一种中级编程语言以其灵活、高效等优点而获得广泛应用许多的应用程序都是用C语言在DOS环境下编写而成。
那么如何发挥
VB和C这两种语言的优势用
VB设计一种良好的for windows界面来调用C语言程序即实现
VB调用C语言程序呢现有的文献只提到动态链接库以下简称DLL可以将这两种语言连接起来但有讲动态链接库DLL的制做及其编程方法。
本文详细介绍了Borland C环境下制作动态链接库以及
VB调用for dos动态链接库的的方法、步骤并通过实例描述
VB调用C程序的全过程。
二、用Borland C编写DLL程序的方法 要想实现
VB调用C程序首先需要用Borland C编写动态连接库DLL程序假设DLL程序取名为example。
动态链接库包含四个文件C语言源程序.C、模块定义文件.DEF、原型函数文件.H和工程文件.PRJ。
下面分别详细介绍一下这四种文件的具体结构。
1、编写C语言源程序的框架 C语言源程序example.C它包括三种函数入口函数、输出函数和终止函数。
其具体结构如下 // / 文件名 example.C / // include /入口函数/ int FAR PASCAL LibMain HANDLE hInstance WORD wDataSeg WORD cbHeapSize LPSTR lpszCmdLine if cbHeapSize0 UnlockData0 return 1 /输出函数/ int FAR PASCAL exampleint param1...char param n ...... /C语言应用程序/ /终止函数/ int FAR PASCAL WEP int /SystemExit/ return1 以上各组成部分参数的含义Windows.h头文件它包含有数据类型的定义、API入口点定义和其它有用的参数信息。
PASCAL说明符定义该程序的传递参数和净化堆栈的协定注意DLL外部传送的指针必须是远指针FAR。
LibMain带四个参数 hInstance、 wDataSeg、cbHeapSize和lpszCmdLine。
第一个参数hInstance是DLL事例句柄 wDataSeg参数是数据段DS寄存器值cbHeapSize参数是在模块定义文件中定义的堆的大小LibMain 使用该值使本地堆初始化。
lpszCmdLine参数包括命令行信息但很少被DLL使用。
一般来说这四个参数是制作DLL通用的参数。
如果不想让DLL数据被封住那么必须调用unlockdata恢复正常的非锁状态如果DLL初始化已经成功DLL则返回1若不成功则返回0值且 DLL退出
系统。
DLL的输出函数实现用户所要完成的任务这部分是DLL的核心。
它与一般C语言程序不同之处在于无scanf函数。
所有的外部指针都是远指针FAR。
画直线函数要用lineto函数。
DLL包括一个终止函数终止函数有时称为退出函数它的名字必须是WEP。
且它可以被包括在DLL模块定义文件的EXPORTS段中。
2、模块定义文件.DEF的结构和各段的意义 模块定义文件的结构如下 // / 文件名 example.DEF / // LIBRARY example / DLLname / DESCRIPTION example.DLL EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS example 1 WEP 2 关键字LIBRARY是把这个模块视为一个DLL库的名字example跟在其后且必须与该库的名字、DEF中的DLL的文件名相一致。
DESCRIPTION语句采用一个字符串其长度可达128 个字符通
常用它来保存模块描述的信息。
EXETYPE windows语句每个windows应用
程序和 DLL都需要。
DATA语句定义该库数据段的内存属性关键字MOVEABLE允许内存管理程序在 必要时移动内存段关键字SINGLE是DLL必要因为DLL总是有一个单一数据段而不管访 问它的应用程序的数量。
HEAPSIZE语句用来定义一个DLL局部堆的初始规模执行局部内 存分配的DLL必须在库启动时使该堆初始化堆的大小被传送给DLL的LiEntry的程序。
然 后用该堆的大小调用Locallnit使DLL的局部堆初始化。
EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序windows利用这个信息建立一个序数入口值序数入口值是一个优化的值允许动态连接机制更快块操作且使用较少的内存。
一般来说模块定义文件.DEF的结构除取动态库的名字不同外其它结构都是固定的。
3建立原形函数文件.H 原形函数的功能是进一步声明调用函数的函数名和传递的参数其形式为 // / 文件名 example.H / // extern C int _export FAR PASCAL exampleint param1...char param n 4建立工程文件.PRJ 工程文件中包含有example.C、example.DEF两个文件后然后编译连接生成动态链接库即可。
以上是制作动态连接库的框架现在通过一个实例介绍制作动态链接库的方法。
如要求程序完成功能为打开一个数据文件读出前两个数据将这两个数与所传递的两个参数相加返回它们的和。
设该DLL程序的名字为ADD。
第一步在Borland C环境下编辑.C文件、.DEF文件和.H文件并建立.PRJ文件。
如 1编写C语言源程序清单 // / 文件名 ADD.C / // include include include include include include include include include c:ADD.h /入口函数/ int FAR PASCAL LibMain HANDLE hInstance WORD wDataSeg WORD cbHeapSize LPSTR lpszCmdLine if cbHeapSize0 UnlockData0 return 1 /输出函数/ int FAR PASCAL ADDint xint ychar filein int ab fpfopenfileinr iffpNULL exit0 int temp10temp20 fscanffpda fscanffpdb temp1xa temp2yb temp1temp1temp2 fclosefp returntemp1 /退出函数/ int FAR PASCAL WEP int/SystemExit/ return1 2ADD.DEF文件的程序清单 // / 文件名 ADD.H / // LIBRARY ADD DESCRIPTION ADD.DLL EXETYPE WINDOWS CODE PRELOAD MOVEABLE DISCARDABLE DATA PRELOAD MOVEABLE SINGLE HEAPSIZE 1024 EXPORTS ADD 1 WEP 2 3ADD.H程序清单 // / 文件名 ADD.H / // extern C int _export FAR PASCAL addint xint ychar filein 4建立工程文件 在Borland C环境下的project项中打开open project file项并建立ADD.prj在additem中加入ADD.C文件和ADD.DEF文件即可建立工程文件。
第二步在Borland C的options项的Applation中选择Windows DLL再在Compile中选择 Build all这样就可生成动态链接库ADD.DLL供
VB调用。
三、
VB3.0调用动态链接库DLL方法 制作好DLL之后就可以用
VB调用它实现
VB调用C程序。
VB程序要使用DLL中的函数 首先必须要有特殊的声明用Declare声明语句在窗体级或模块级或全局模块的
代码声明段进行声明将动态链接库中的函数声明到
VB中供
VB程序调用。
语句格式为Declare Sub 过程名Lib摽铍黚_n Alias 别名ByVal 参数AS类型或为Declare Function函数名Lib摽铍黚_衃 Alias 别名ByVal 参数AS类型AS类型在声明中首先用Declare关键字表示声明DLL中的函数。
在C语言中有的函数类型为VOID它表示不具有返回值则必须用关键字Sub将其声明成过程。
有的函数具有返回值则必须用关键字Function将其声明成函数并且在声明语句的最后要用AS关键字指明函数返回值的类型。
例如上面的ADD.DLL在
VB中就可以声明为 Declare Function ADD Lib抚c:ADD.dll敚―ByVal X AS Integer ByVal Y AS Integer ByVal filein as stringAS Integer 通过此声明语句将函数ADD声明到
VB中便可直接调用。
四、结束语 以上详细介绍了Borland C环境下制作动态链接库以及
VB调用for dos动态链接库的方法、步骤并通过实例说明
VB调用C语言程序的方法。
举例程序ADD经
VB3.0编译在486微机上调试通过。
本文介绍的方法具有广泛的意义也完全适用于C 语言程序。