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

  Visual Basic( 以下简称VB)是种可视化面向对象编程语言以其编程简单、快捷等特点深受广大WINDOWS青睐利用VB开发界面友好、操作方便软件Software只需很短时间但是VB运行速度较慢对于庞大科学计算问题VB这种慢速会使人难以忍受C语言是国际上非常流行种中级编程语言以其灵活、高效等优点而获得广泛应用许多应用都是用C语言在DOS环境下编写而成那么如何发挥VB和C这两种语言优势用VB设计种良好for windows界面来C语言即实现VBC语言呢?现有文献只提到动态链接库(以下简称DLL)可以将这两种语言连接起来但有讲动态链接库DLL制做及其编程思路方法本文详细介绍了Borland C环境下制作动态链接库以及VBfor dos动态链接库思路方法、步骤并通过例子描述VBC全过程

   2、用Borland C编写DLL思路方法

  要想实现VBC首先需要用Borland C编写动态连接库DLL(假设DLL取名为example)动态链接库包含 4个文件:C语言源(.C)、模块定义文件(.DEF)、原型文件(.H)和工程文件(.PRJ)下面分别详细介绍下这 4种文件具体结构

  1、编写C语言源框架:

  C语言源(example.C)它包括 3种:入口、输出和终止其具体

  结构如下:

  /*************************************/

  /* 文件名: example.C */

  /*************************************/

  # <windows.h>

  /***********入口***********/

   FAR PASCAL LibMain ( HANDLE hInstance,
  WORD wDataSeg,
  WORD cbHeapSize,
  LPSTR lpszCmdLine )
  {
     (cbHeapSize!=0)
    UnlockData(0);
     (1);
  }


  /***********输出***********/

   FAR PASCAL example( param1,...,char param n)
  {
    ...... /*C语言应用*/
  }
  /***********终止***********/
   FAR PASCAL WEP ( /*Exit*/ )
  {
    (1);
  }


  以上各组成部分参数含义:Windows.h头文件它包含有数据类型定义、API入口点定义和其它有用参数信息PASCAL介绍说明符定义该传递参数和净化堆栈协定(注意:DLL外部传送指针必须是远指针FAR)

  LibMain带 4个参数:

  hInstance、 wDataSeg、cbHeapSize和lpszCmdLine个参数hInstance是DLL事例句柄 wDataSeg参数是数据段(DS)寄存器值cbHeapSize参数是在模块定义文件中定义大小LibMain 使用该值使本地堆lpszCmdLine参数包括命令行信息但很少被DLL使用般来说这 4个参数是制作DLL通用参数

  如果不想让DLL数据被封住那么必须unlockdata恢复正常非锁状态如果DLL化已经成功DLL则返回1若不成功则返回0值且 DLL退出系统DLL输出实现用户所要完成任务这部分是DLL核心它和般C语言区别的处在于无scanf所有外部指针都是远指针FAR画直线要用linetoDLL包括个终止终止有时称为退出名字必须是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必须在库启动时使该堆大小被传送给DLLLiEntry然 后用该堆大小Locallnit使DLL局部堆

  EXEPORTS语句定义将被用作来自应用或来自其它DLL入口点windows利用这个信息建立个序数入口值序数入口值是个优化允许动态连接机制更快块操作且使用较少内存

  般来说模块定义文件(.DEF)结构除取动态库名字区别外其它结构都是固定

  

  3.建立原形文件(.H)

  原形功能是进步声明名和传递参数其形式为:

  /*************************************/

  /* 文件名: example.H */

  /*************************************/

  extern "C" _export FAR PASCAL example( param1,...,char param n) ;

  4.建立工程文件(.PRJ)

  工程文件中包含有example.C、example.DEF两个文件后然后编译连接生成动态链接库即可

  以上是制作动态连接库框架现在通过个例子介绍制作动态链接库思路方法如要求完成功能为:打开个数据文件读出前两个数据将这两个数和所传递两个参数相加返回它们设该DLL名字为ADD

  第步:在Borland C环境下编辑.C文件、.DEF文件和.H文件并建立.PRJ文件

  (1)编写C语言源清单:

  /*************************************/

  /* 文件名: ADD.C */

  /*************************************/

  # <iostream.h>
  # <conio.h>
  # <io.h>
  # <alloc.h>
  # <stdlib.h>
  # <windows.h>
  # <math.h>
  # <stdio.h>
  # "c:ADD.h"
  /*入口*/
   FAR PASCAL LibMain (HANDLE hInstance ,
  WORD wDataSeg ,
  WORD cbHeapSize,
  LPSTR lpszCmdLine )
  {
     (cbHeapSize!=0)
    UnlockData(0);
     1;
  }
  /*输出*/
   FAR PASCAL ADD( x, y,char *filein)
  { a,b;
    fp=fopen(filein,"r");
    (fpNULL) { exit(0);}
     temp1=0,temp2=0;
    fscanf(fp,"%d",&a);
    fscanf(fp,"%d",&b);
    temp1=x+a;
    temp2=y+b;
    temp1=temp1+temp2;
    fclose(fp);
    (temp1);
  }
  /*退出*/
   FAR PASCAL WEP ( /*Exit*/ )
  {
    (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


  (3)ADD.H清单:

  /*************************************/

  /* 文件名: ADD.H */

  /*************************************/

  extern "C" _export FAR PASCAL add( x, y,char *filein) ;

  (4)建立工程文件:

  在Borland C环境下project项中打开open project file项并建立ADD.prj在add item中加入ADD.C文件和ADD.DEF文件即可建立工程文件

  第 2步在Borland Coptions项Applation中选择Windows DLL再在Compile中选择Build all这样就可生成动态链接库ADD.DLL供VB

   3、VB3.0动态链接库DLL思路方法

  制作好DLL的后就可以用VB实现VBCVB要使用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 )AS Integer

  通过此声明语句将ADD声明到VB中便可直接

   4、结束语

  以上详细介绍了Borland C环境下制作动态链接库以及VBfor dos动态链接库思路方法、步骤并通过例子介绍说明VBC语言思路方法举例ADD经VB3.0编译在486微机上调试通过本文介绍思路方法具有广泛意义也完全适用于C 语言



Tags:  c程序设计语言 c程序 c程序设计

延伸阅读

最新评论

发表评论