📄 vb21.htm
字号:
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> 以上各组成部分参数的含义: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> </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> EXEPORTS语句定义将被用作来自应用程序或来自其它DLL入口点的程序,windows利用这个信息建立一个序数入口值,序数入口值是一个优化的值,允许动态连接机制更快块操作且使用较少的内存。<BR> </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> </SPAN></P>
<P><SPAN
class=sfont>工程文件中包含有example.C、example.DEF两个文件后,然后编译连接生成动态链接库即可。<BR> </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
<iostream.h><BR>#include <conio.h><BR>#include
<io.h><BR>#include <alloc.h><BR>#include
<stdlib.h><BR>#include <windows.h><BR>#include
<math.h><BR>#include <stdio.h><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",&a);<BR>fscanf(fp,"%d",&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> 制作好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> 以上详细介绍了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>版权所有©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 + -