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

[入库:2005年8月18日] [更新:2007年3月24日]

本文简介:选择自 showman 的 blog

摘 要
       文中介绍了一种实现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的局部堆初始化。
      exeports语句定义将被用作来自应用程序或来自其它dll入口点的程序,windows利用
这个信息建立一个序数入口值,序数入口值是一个优化的值,允许动态连接机制更快块操
作且使用较少的内存。
      一般来说,模块定义文件(.def)的结构除取动态库的名字不同外,其它结构都是固定
的。
3.建立原形函数文件(.h)
原形函数的功能是进一步声明调用函数的函数名和传递的参数,其形式为:
/*************************************/
/* 文件名: example.h */
/*************************************/
extern "c" int _export far pascal example(int param1,...,char param n) ;
4.建立工程文件(.prj)
       工程文件中包含有example.c、example.def两个文件后,然后编译连接生成动态链接
库即可。
       以上是制作动态连接库的框架,现在通过一个实例介绍制作动态链接库的方法。如要
求程序完成功能为:打开一个数据文件读出前两个数据,将这两个数与所传递的两个参数
相加,返回它们的和。设该dll程序的名字为add。
第一步:在borland c++环境下编辑.c文件、.def文件和.h文件,并建立.prj文件。如
(1)编写c语言源程序清单:
/*************************************/
/* 文件名: add.c */
/*************************************/
#include <iostream.h>
#include <conio.h>
#include <io.h>
#include <alloc.h>
#include <stdlib.h>
#include <windows.h>
#include <math.h>
#include <stdio.h>
#include "c:\add.h"
/*入口函数*/
int far pascal libmain (handle hinstance ,
word wdataseg ,
word cbheapsize,
lpstr lpszcmdline )
{
if (cbheapsize!=0)
unlockdata(0);
return 1;
}
/*输出函数*/
int far pascal add(int x,int y,char *filein)
{ int a,b;
fp=fopen(filein,"r");
if(fp==null) { exit(0);}
int temp1=0,temp2=0;
fscanf(fp,"%d",&a);
fscanf(fp,"%d",&b);
temp1=x+a;
temp2=y+b;
temp1=temp1+temp2;
fclose(fp);
return(temp1);
}
/*退出函数*/
int far pascal wep ( int/*systemexit*/ )
{
return(1);
}
2)add.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

本文关键:VB调用C程序的方法—动态链接库法
  相关方案
Google
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top