当前位置: 主页 > 论文库 > 计算机 > 计算机应用 >

VB调用C程序的方法—动态链接库法

时间:2009-07-21 10:45 来源:www.lunwen163.com 作者:163论文网 点击:
文中介绍了一种实现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 <windows.h>
/***********入口函数***********/
int FAR PASCAL LibMain ( HANDLE hInstance,
WORD wDataSeg,
WORD cbHeapSize,
LPSTR lpszCmdLine )
{
if (cbHeapSize!=0)
UnlockData(0);
return (1);
}

/***********输出函数***********/

int FAR PASCAL example(int param1,...,char param n)
{
...... /*C语言应用程序*/
}
/***********终止函数***********/
int FAR PASCAL WEP ( int /*SystemExit*/ )
{
return(1);
}
       以上各组成部分参数的含义: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的局部堆初始化。

[1] [2] 下一页