说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

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

HTML文档下载 WORD文档下载 PDF文档下载
VB调用C程序动态链接库的方法
摘 要
文中介绍了一种实现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
/***********入口函数***********/
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
#include
#include
#include
#include
#include
#include
#include
#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
(3)ADD.H程序清单:
/*************************************/
/* 文件名: ADD.H */
/*************************************/
extern "C" int _export FAR PASCAL add(int x,int y,char *filein) ;
(4)建立工程文件:
在Borland C++环境下的project项中打开open project file项并建立ADD.prj,在add
item中加入ADD.C文件和ADD.DEF文件即可建立工程文件。
第二步,在Borland C的options项的Applation中选择Windows DLL,再在Compile中选择Build all,这样就可生成动态链接库ADD.DLL供VB调用。

三、VB3.0调用动态链接库DLL方法

制作好DLL之后,就可以用VB调用它,实现VB调用C程序。VB程序要使用DLL中的函数,首先必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。
语句格式为:Declare Sub 过程名Lib [ 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
string)AS Integer
通过此声明语句将函数ADD声明到VB中,便可直接调用。

四、结束语

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

在VB中模拟实现邮件传输 在VB中实现文件上传 在VB中使用UDP协议 在VB中用Outlook发电子邮件 在程序中打开 Internet 拨号连接窗口 -VB资料 在一个单位内部或通过广域协议(如X.25)互联的行业内部都有几十或上万台计算机互联,用Intrane 在应用中集成浏览器-VB资料 在桌面上建立一个 Internet 快捷键 -VB资料 VB怎样接收电子邮件(POP3协议简介) VB怎样用VB得知系统当前是否处于internet链结状态 VB制作自己的网络搜索软件 自动更新工作站的应用程序-VB资料 自己的IE——用VB制作浏览器 VB6制作Win98风格的工具栏 VB实现窗口的弹出式菜单 用VB做个漂亮的进度条 Cool 3D 浮動按鈕的模擬作法-VB资料 VB 5.0中实现鼠标拖放 VB5.0下工具条的制作 VB5.0中基于桌面的屏幕技巧 VB5.0中实现字体闪烁效果 VB5实现窗口图像缩放、滚动技巧 VB6.0动态加载ActiveX控件漫谈 VB编程步步高-表单篇 VB编程常见问题 VB编程中如何锁定鼠标 VB创建位图菜单 VB实现按钮浮动效果 VB应用程序中的工具提示和状态显示 VB中处理长列表框项的两种方法 VB中多级下拉列表的实现 上海的朋友有人知道宏野通信公司吗? DataGrid中绑定列的问题?WebForm 网站中的搜索的工作原理是什么? 關於搜索文件的源碼 急!!!怎样连接访问有密码的Access 数据库? 在上海找工作的看过来! 我是初学者,帮我看看为什么onserverclick就起作用? 这些帖子居然成为经典,请看此问题!!!!!!!!! 关于recordset的问题解决方法? 目录选择对话框。 简单问题,界面左边进行树形控制,怎样调用对话框(不是切换视) 在线等候帮助!!! 使用过F1book的朋友请看一下! 怎样让弹出的窗口位于显示屏幕中间的位置。而不是两边。 急,高手请进,如何将sQLserver7备份到局域网中另一台计算机的硬盘上 请高手:怎样改变ListView的表头的颜色,字体. 中国武侠剧一定要的必备情节 安装问题 这不是真的!VC的速度还没有VB快! 兄弟改名了 关于网页的打印(急,200分)? 新操作系统,老编程工具 这样能兼容吗? 记得每天点一点你的竞争对手。 我是一个VC初学者,请问这几句代码是什么意思? 2万元寻人力资源软件 友情链接,我的网站http://fullstrong.myetang.com/ ODBC高手请进,高分送出! 写email地址搜寻类软件,有没有利润? 初级XML的问题 友情链接,我的网站http://fullstrong.myetang.com/ 为什么我的excel文件打不开 请问如何在DataGrid中假如CheckBox控件? 高手帮忙看一下邮件发送的错误提示 IIS问题:如何使web application在iis管理mmc中不可见 2万元寻人力资源管理软件 友情链接,我的网站http://fullstrong.myetang.com/ 使用jdom遇到的莫名其妙的问题(有关Element.getChildren()返回类型?) 运行速度的问题如何解决? 对ISO98版的c++支持最好的编译器是什么(unix\win\dos)? sqlserver网络备份是错误码42000。详情请看。。。 急!!请问如何通过程序检测一个系统中的Office版本(比如:中文版,英文版) 请问有人知道上海伍尔特国际咨询公司的朋友嘛 ? 怎样在信件里面自动添加信息? 2万元寻人力资源管理软件 友情链接,我的网站http://fullstrong.myetang.com/ 有没有人统计过windows有多少个api加上shell呢? 请问:winsock的SendData的调用,在收发email时改如何设置参数 请问gdk和gtk的函数库是怎么按装的? 搞不定了,7456..来回切换窗口状态的问题, 有源码 友情链接,我的网站http://fullstrong.myetang.com/ 请问RTDB(实时数据库和商用数据库的区别) 洗脸盆,都有什么牌子?怎么挑-选? 标志着我国进入社会主义初级阶段的重大事件是什么 一物体由静止开始做匀加速直线运动 加速度大小为A1 经时间T后做匀减速直线运动 加速度大小为A2若再经时间T恰能回到出发点 则A1 A2之比为多少 在这个问题中加速过程和减速过程所走的位移 洗脸盆选什么材质的好? 我国什么时候开始进入社会主义初级阶段的,标志是什么 2-氯-5-硝基苯甲酸的合成,原料是什么啊?怎么合成的啊? 一物体在做匀加速直线运动,在第一个ts内的位移为x1,第二个ts内位移为x2,则物体在第一个ts末的速度 红磷在空气中燃烧点燃红磷前为什么要用夹子夹紧 实验室欲佩制50克50%的NaCl溶液,计算:需要NaCl质量为()克,水的质量为()克,约()ml 一个物体做自由落体运动,计算:ts内跟2ts内重力所做的功之比. 哪些鱼的含汞量较高? 小明需15 %的硝酸钾溶液300克 但实验室里只有30%的硝酸钾溶液 小明应如何配制溶液!说明 物体做自由落体运动,在第ts内通过的位移是hm,则t是()A.(2h+g)/2g B.(2h-g)/2g C.2h/g D.√(2h/g)我怎么算的是D 鱼汞主要集中在鱼的那个组织中A 肝脾B 肠道C 鱼肉D 鱼骨 以苯为原料如何制间氯苯甲酸 邻苯二甲酸酐 间硝基苯甲酸具体过程 谢谢 以大小水平v的速度抛出一质量为m的物块,ts后物体下落一段距离v不变,速度方向相反,则:A 风力对物体做功为零B 风力对物体做负功C 物体机械能减少0.5mggttD 风力对物体的冲量大小2mv 汞含量高的鱼有哪些 由对硝基苯甲酸为原料合成对氨基苯甲酸乙酯过程反应式加氢反应不用氢气,在实验室里没有这个条件 有一个梯形物体浸没在水中,水的密度P,深度为H,物块高度为h,体积为V,较小的下底面面积为S,与容器底精密接触,其间无水,则物块所受浮力为答案要用所给条件表示 列举民主革命和社会主义建设两个不同时期的标志性事件并作相应评述 0.02mol/l的稀硝酸怎么配 一分贝的声音到底有多大?正常人能感觉得到的声音有多少分贝?正常人能觉得多少分贝的声音算大或者清楚?多少分贝的声音算噪音污染? 下面几题怎么解释 帮下忙 初三科学5.如图所示,电源的输出电压恒定不变,现将一个灯泡L接在离电源很近的AB两点时,灯泡L耗费的功率为25W,若将灯泡L接在离电源较远的CD两点时,灯泡L耗费的功 某物体由静止开始做加速度为a1的匀加速运动,运动了t1时间后改为做加速度为a2的匀减速直线运动,经过t2时间后停下.则物体在全部时间内的平均速度为( )这是多选题.请详细解释每一个选 玻璃脸盆是怎么制做的 初三科学第三题求讲解 某物体由静止开始作匀加速直线运动.加速度大小为a1.运动时间为t1.接着作加速度大小为a2的匀减速运动.再...某物体由静止开始作匀加速直线运动.加速度大小为a1.运动时间为t1.接着作加速度 原子种类 质子数 中子数 核外电子数 相对原子质量氢                  1         &# 实验名,气体性质,周期规律,运算、配平方法什么的要说明白,不然很难看懂 运动一物体有静止开始做匀加速直线运动,加速度大小为a1,经实践t1后做匀减速直线,加速度大小为a2,若再运动一物体有静止开始做匀加速直线运动,加速度大小为a1,经时间t后做匀减速直线运动, 初二化学12检验糖尿病人的尿液,要配制8%的硫酸铜溶液200g,下列配置过程中正确的是A 只需托盘天平和量筒两种仪器B 砝码放在左盘上,称取16g无水硫酸铜C 用量筒量取184ml水D 把无水硫酸铜倒 一物体由静止开始做匀加速直线运动,在ts内通过的位移xm,则它从出发开始通过x/4所用的时间 我国社会进入社会主义社会根本标志是什么 作匀加速直线运动的物体,在ts内的位移仅决定于C. 在测定氧气的体积分数的实验中,为什么橡皮塞塞得过慢和弹簧夹未夹紧会导致测得氧气体积偏大? 56克铁和足量稀硝酸溶液反应转移电子数为多少 几个做匀变速运动的物体,在ts内的位移最大的是A 加速度最大的 b 初速度最大的 c 末速度最大的 d 平均速度最大的 硝酸铅溶液配制时为什么必须加入硝酸? a克铜与b克硝酸溶液恰好完全反应若a:b=8:21,则起氧化作用的硝酸质量为多少?题目既没说是浓也没说是稀.无法得知产物该从何下手?提示用b表示. 3道初三科学竞赛题(要讲解)11.已知浓硫酸比稀硫酸的密度大,质量分数分别为90%和10%的两种硫酸溶液等体积混合后所得溶液的质量分数为 AA.大于50% B.等于50% C.小于50% D.无法 新民主主义时期和社会主义建设时期的标志性事件 二氧化氮溶于100克水中,完全反应后溶液质量增加10.8克,生成硝酸溶液的质量 r原子的核外m层与k层上的电子数相等,下列说法正确的是:a r的氧化物分子式为r2ob r能置换下硫酸中的氢c r是非金属元素d r不与硫酸铜反应 列举民主革命和社会主义建设两个不同时期的其他阶段的标志性事件并做相应评述 我国进入社会主义社会的根本标志是什么?我国进入社会主义社会的根本标志 初三科学题.请详解.1.如图1所示,要使重为10牛的物体,保持与水平成45度角的方向匀速直线运动,应对物体施加 (10) 牛的力,此力的方向为(竖直向上) 2.图二 一个人在火车车厢内向车位方向抛出 社会主义建设时期的标志性事件并做相应评述 把7.2克钠放入到某硝酸溶液中把7.2克铁粉放入到某硝酸溶液中,充分反应后剩余固体1.6克,产生NO2和NO的混合气体0.08mol.则原硝酸溶液中硝酸的物质的量为多少? 下列说法正确的是( )A.氢氧化钠晶体中不存在离子,所以,它的晶体不能导电B.氯化钡溶液在通电时能发生电离,所以,氯化钡溶液能导电C.在水溶液中电离出氢离子或酸根离子的化合物可能是 为什麽汞是人体必需的微量元素 一物体由静止开始做匀加速直线运动,在ts内经过的位移为xm,则它由静止开始经过x/4 m所用时间为?t/4t/2t/16二分之根号二t 向盛有水(为了便于观察,液体为红色)的试管中慢慢注入3毫升浓硫酸,此时可观察到U形管内液面的变化是( )A.A侧液面高于B侧液面 B.B侧液面高于A侧液面C.无变化 D.A、B两侧液面同时升高某同 氮和汞是不是人体必需的微量元素 一物体做匀加速直线运动,在第一个ts内位移为s1,第二个位移内为2s,则物体在第一个ts末的速度是?a s2-s1/t b s2+s1/t c s2-s1/2t d s2+s1/2t 30~40分贝的声音有多大? 身体含汞高有什么症状 民主革命时期的标志性事件和社会主义建设时期的标志性事件有哪些? 一分贝声音有多大 我国社会主义初级阶段从何时开始?标志性事件是什么? 民主革命时期标志性事件及相应评述
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘