⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vb21.htm

📁 VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程VB学习教程
💻 HTM
📖 第 1 页 / 共 2 页
字号:
      LibMain ( HANDLE hInstance,<BR>WORD wDataSeg,<BR>WORD cbHeapSize,<BR>LPSTR 
      lpszCmdLine )<BR>{<BR>if (cbHeapSize!=0)<BR>UnlockData(0);<BR>return 
      (1);<BR>}<BR><BR>/***********输出函数***********/<BR><BR>int FAR PASCAL 
      example(int param1,...,char param n)<BR>{<BR>...... /*C语言应用程序*/ 
      <BR>}<BR>/***********终止函数***********/<BR>int FAR PASCAL WEP ( int 
      /*SystemExit*/ 
      )<BR>{<BR>return(1);<BR>}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上各组成部分参数的含义:Windows.h头文件,它包含有数据类型的定义、API入口点定义和其它有用的参数信息。PASCAL说明符定义该程序的传递参数和净化堆栈的协定(注意:DLL外部传送的指针必须是远指针FAR)。LibMain带四个参数: 
      hInstance、 wDataSeg、cbHeapSize和lpszCmdLine。第一个参数hInstance是DLL事例句柄, 
      wDataSeg参数是数据段(DS)寄存器值,cbHeapSize参数是在模块定义文件中定义的堆的大小,LibMain 
      使用该值使本地堆初始化。lpszCmdLine参数包括命令行信息,但很少被DLL使用。一般来说,这四个参数是制作DLL通用的参数。<BR></SPAN></P>
      <P><SPAN 
      class=sfont>如果不想让DLL数据被封住,那么必须调用unlockdata恢复正常的非锁状态,如果DLL初始化已经成功,DLL则返回1,若不成功则返回0值,且 
      DLL退出系统。<BR></SPAN></P>
      <P><SPAN 
      class=sfont>DLL的输出函数实现用户所要完成的任务,这部分是DLL的核心。它与一般C语言程序不同之处在于无scanf函数。所有的外部指针都是远指针FAR。画直线函数要用lineto函数。<BR></SPAN></P>
      <P><SPAN 
      class=sfont>DLL包括一个终止函数,终止函数有时称为退出函数,它的名字必须是WEP。且它可以被包括在DLL模块定义文件的EXPORTS段中。 
      <BR></SPAN></P>
      <P><SPAN class=sfont>2、模块定义文件(.DEF)的结构和各段的意义<BR></SPAN></P>
      <P><SPAN 
      class=sfont>模块定义文件的结构如下:<BR>/*************************************/<BR>/* 
      文件名: example.DEF */<BR>/*************************************/<BR>LIBRARY 
      example /* DLLname */<BR>DESCRIPTION ' example.DLL'<BR>EXETYPE 
      WINDOWS<BR>CODE PRELOAD MOVEABLE DISCARDABLE<BR>DATA PRELOAD MOVEABLE 
      SINGLE<BR>HEAPSIZE 1024<BR>EXPORTS<BR>example @1<BR>WEP 
      @2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></P>
      <P><SPAN 
      class=sfont>关键字LIBRARY是把这个模块视为一个DLL,库的名字example跟在其后,且必须与该库的名字、DEF中的DLL的文件名相一致。DESCRIPTION语句采用一个字符串,其长度可达128 
      个字符,通常用它来保存模块描述的信息。EXETYPE windows语句每个windows应用程序和 
      DLL都需要。DATA语句定义该库数据段的内存属性,关键字MOVEABLE允许内存管理程序在 
      必要时移动内存段,关键字SINGLE是DLL必要,因为DLL总是有一个单一数据段,而不管访 
      问它的应用程序的数量。HEAPSIZE语句用来定义一个DLL局部堆的初始规模,执行局部内 
      存分配的DLL必须在库启动时使该堆初始化,堆的大小被传送给DLL的LiEntry的程序。然 
      后用该堆的大小调用Locallnit使DLL的局部堆初始化。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序,windows利用这个信息建立一个序数入口值,序数入口值是一个优化的值,允许动态连接机制更快块操作且使用较少的内存。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></P>
      <P><SPAN 
      class=sfont>一般来说,模块定义文件(.DEF)的结构除取动态库的名字不同外,其它结构都是固定的。<BR></SPAN></P>
      <P><SPAN class=sfont>3.建立原形函数文件(.H)<BR></SPAN></P>
      <P><SPAN 
      class=sfont>原形函数的功能是进一步声明调用函数的函数名和传递的参数,其形式为:<BR>/*************************************/<BR>/* 
      文件名: example.H */<BR>/*************************************/<BR>extern "C" 
      int _export FAR PASCAL example(int param1,...,char param n) 
      ;<BR></SPAN></P>
      <P><SPAN 
      class=sfont>4.建立工程文件(.PRJ)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></P>
      <P><SPAN 
      class=sfont>工程文件中包含有example.C、example.DEF两个文件后,然后编译连接生成动态链接库即可。<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN></P>
      <P><SPAN 
      class=sfont>以上是制作动态连接库的框架,现在通过一个实例介绍制作动态链接库的方法。如要求程序完成功能为:打开一个数据文件读出前两个数据,将这两个数与所传递的两个参数相加,返回它们的和。设该DLL程序的名字为ADD。<BR>第一步:在Borland 
      C++环境下编辑.C文件、.DEF文件和.H文件,并建立.PRJ文件。如<BR></SPAN></P>
      <P><SPAN 
      class=sfont>(1)编写C语言源程序清单:<BR>/*************************************/<BR>/* 
      文件名: ADD.C */<BR>/*************************************/<BR>#include 
      &lt;iostream.h&gt;<BR>#include &lt;conio.h&gt;<BR>#include 
      &lt;io.h&gt;<BR>#include &lt;alloc.h&gt;<BR>#include 
      &lt;stdlib.h&gt;<BR>#include &lt;windows.h&gt;<BR>#include 
      &lt;math.h&gt;<BR>#include &lt;stdio.h&gt;<BR>#include 
      "c:\ADD.h"<BR>/*入口函数*/<BR>int FAR PASCAL LibMain (HANDLE hInstance 
      ,<BR>WORD wDataSeg ,<BR>WORD cbHeapSize,<BR>LPSTR lpszCmdLine )<BR>{<BR>if 
      (cbHeapSize!=0)<BR>UnlockData(0);<BR>return 1;<BR>}<BR>/*输出函数*/<BR>int FAR 
      PASCAL ADD(int x,int y,char *filein)<BR>{ int 
      a,b;<BR>fp=fopen(filein,"r");<BR>if(fp==NULL) { exit(0);}<BR>int 
      temp1=0,temp2=0;<BR>fscanf(fp,"%d",&amp;a);<BR>fscanf(fp,"%d",&amp;b);<BR>temp1=x+a;<BR>temp2=y+b;<BR>temp1=temp1+temp2;<BR>fclose(fp);<BR>return(temp1);<BR>}<BR>/*退出函数*/<BR>int 
      FAR PASCAL WEP ( int/*SystemExit*/ 
      )<BR>{<BR>return(1);<BR>}<BR>2)ADD.DEF文件的程序清单:<BR>/*************************************/<BR>/* 
      文件名: ADD.H */<BR>/*************************************/<BR>LIBRARY 
      ADD<BR>DESCRIPTION 'ADD.DLL'<BR>EXETYPE WINDOWS<BR>CODE PRELOAD MOVEABLE 
      DISCARDABLE<BR>DATA PRELOAD MOVEABLE SINGLE<BR>HEAPSIZE 
      1024<BR>EXPORTS<BR>ADD @1<BR>WEP @2<BR></SPAN></P>
      <P><SPAN 
      class=sfont>(3)ADD.H程序清单:<BR>/*************************************/<BR>/* 
      文件名: ADD.H */<BR>/*************************************/<BR>extern "C" int 
      _export FAR PASCAL add(int x,int y,char *filein) ;<BR></SPAN></P>
      <P><SPAN class=sfont>(4)建立工程文件:<BR>在Borland C++环境下的project项中打开open project 
      file项并建立ADD.prj,在add item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。<BR></SPAN></P>
      <P><SPAN class=sfont>第二步,在Borland C的options项的Applation中选择Windows 
      DLL,再在Compile中选择Build 
      all,这样就可生成动态链接库ADD.DLL供VB调用。<BR><BR>三、VB3.0调用动态链接库DLL方法<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数, 
      首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。<BR></SPAN></P>
      <P><SPAN class=sfont>语句格式为:Declare Sub 过程名Lib摽鈹黚_n[ Alias " 别名]([ByVal 
      参数AS类型]),或为Declare Function函数名Lib摽鈹黚_衃 Alias " 别名]([ByVal 
      参数AS类型])AS类型在声明中首先用Declare关键字表示声明DLL中的函数。在C语言中有的函数类型为VOID,它表示不具有返回值,则必须用关键字Sub将其声明成过程。有的函数具有返回值,则必须用关键字Function将其声明成函数,并且在声明语句的最后要用AS关键字指明函数返回值的类型。<BR></SPAN></P>
      <P><SPAN class=sfont>例如上面的ADD.DLL在VB中就可以声明为:<BR></SPAN></P>
      <P><SPAN class=sfont>Declare Function ADD Lib撫c:\ADD.dll敚―ByVal X AS 
      Integer, ByVal Y AS Integer ,ByVal filein as string)AS 
      Integer通过此声明语句将函数ADD声明到VB中,便可直接调用。<BR><BR>四、结束语<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上详细介绍了Borland 
      C环境下制作动态链接库以及VB调用for 
      dos动态链接库的方法、步骤,并通过实例说明VB调用C语言程序的方法。举例程序ADD经VB3.0编译,在486微机上调试通过。本文介绍的方法具有广泛的意义,也完全适用于C++ 
      语言程序。</SPAN></P>
      <P align=right><A 
      href="http://www.pconline.com.cn/experience/subject/VB/index.html">----更多的文章</A></P>
      <P align=right><A href="http://www.pconline.com.cn/index.html"></A></P><!-- #EndEditable --></TD></TR></TBODY></TABLE>
<TABLE align=center border=0 cellPadding=0 cellSpacing=0 width=760>
  <TBODY>
  <TR>
    <TD bgColor=#666666 width=1><IMG height=1 src="vb21.files/blank.gif" 
      width=1></TD>
    <TD align=right vAlign=bottom width=170><IMG height=10 
      src="vb21.files/blank.gif" width=170><BR></TD>
    <TD bgColor=#666666 width=1><IMG height=1 src="vb21.files/blank.gif" 
      width=1></TD>
    <TD width=21><IMG height=1 src="vb21.files/blank.gif" width=21></TD>
    <TD bgColor=#eeeeee width=566><IMG height=10 src="vb21.files/blank.gif" 
      width=566><BR>版权所有&copy;1999 太平洋电脑信息网<BR><FONT 
      face="Arial, Helvetica, sans-serif"><A 
      href="mailto:exp@pconline.com.cn">exp@pconline.com.cn</A></FONT> <IMG 
      height=1 src="vb21.files/hhvisit.html" width=1> </TD></TR></TBODY></TABLE><!-- #EndTemplate --></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -