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

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++ 语言程序。

依托微信的电商产品实践——SDCC 2013讲师潘凡专访 IBM将向Google、英伟达等授权Power架构技术 人脑研究将推动下一代网络革命?从大爆炸到大收缩 H3C携手F5将“空转”数据中心变为“分布式数据中心” W3C小组发布Web存储API推荐标准 开发者必备的6款源码搜索引擎 闪亮登场:开发者制作图形图表所需的11款JS工具包 来自两位技术大牛的博弈:HBase或将制霸NoSQL? 应用改变世界 2013英特尔®创新应用大赛火热开启 看13位CEO、创始人和高管如何提高工作效率 对首次购买智能手机用户而言,苹果吸引力并不大 Amazon Appstore面向Web应用开放 开发者可添加应用内付费功能 CSC收购成功转型的大数据初创公司InfoChimps 嘀嘀打车发展报告:成全球最大出租车调度平台 又摊上事儿了,Android的MasterKey再次出现bug 比特币挖矿必备工具 硬件性能大比拼 RDBMS vs. NoSQL:反派为什么会得以存活并发展壮大 帮助优化移动网站:谷歌发布新指南和PageSpeed Insights工具 增强Web可用性,你需要避免的七大设计错误 Python六大开源框架对比:Web2py略胜一筹 海外看中国:老外开发者间流传着的7件事儿 京东云峰:电商移动云平台背后的技术 初创公司DigitalOcean:55秒搭建一个云服务器 分布式系统事务原子性的非阻塞实现 IBM发布基于人脑特性设计的全新计算架构和编程语言 16款加速编码的HTML5在线工具 JFrog:开源项目的最大挑战是文档和许可 5个技巧打造完美用户体验,不到两年完成用户万到千万的增长 CDN未来的机遇和挑战 华为S12700全可编程交换机进一步挑战思科 OpenFient创始人:将平台创新进行到底 我的浏览器怎么了?? 心情好到最高点!放分!!!!!!!!!! 大家一定要帮帮我~~~~~~~~~ 一个关于重载的问题! 不活了 不活了.... 在VC中讲Edit控件的属性设置为ReadOnly后,如何改变控件的背景色??? 深圳的户口政策以及用人单位对户口的态度是怎样的? 200分求购一个VB写的用mciSendCommand播放VCD或者AVI的例子!!!!!!!! 请问大家认为数学对程序员来说是一个怎样的地位................ 紧急,求救!!!!!!!!!!!!!!! 请问在GSM MODEM编程中,如何知道短信是否已发送到目的手机! 急:为什么都用uses包含了,还是报告说没定义变量? 删除表时遇到的问题 *************stringgrid的问题?????? 再问几个问题 如何查找csdn上网的朋友 用 ADO 对 Oracle blob 字段读写 (谁能解决送1000分) 请问oracle9i比oracle8i多了那些功能?这个产品是否成熟? VB读串口数据 请问,你们做项目一般用什么分析设计方法,生命周期法? 快速原型法? 面向对象分析设计法?? 请问如何用query删除一个记录???????????????????????? 请问那里可以下载到雷电(指点一下也给分)……………… 初级问题,关于硬盘文件格式转换,请多多帮忙,谢谢! 那里有比较好的软件公司 毕业设计选题 谁有读写注册表的原代码? 请问那位大哥有画切线的C语言算法 如何使页面上的按钮被点击后自动打印当前页面? 哪儿可以下载星际争霸? 注册表中如何建新的主键?30分 寻求在tc下设置640*480(256色)模式的代码 DELPHI 真的好难 哪里有支持ASP+access的免费空间?!!30分 SaveDialog该如何使用? 为什么csdn把大家的回复都发到我的邮箱里去了???!!!! 我在学WinSocket,请问现在外面WinSocket吃香吗?一般做什么东西要用WinSocket的?找的到工作吗?还有Qos,RAS是什么东西?有人学吗?好象和编程不搭架的? 我的显卡OpenGL在Win2000下用不起来,驱动是对的,显卡是Creative TNT2 ?SOS D盘没了! 请教一条SQL语句 你们认为我是学VC好还是学BCB 请问哪里有VBscript函数的详细介绍呀? 如何在程序中给系统一个鼠标中键按下的信号?请给出详细的源代码 *********_____-------___---简单问题大送分!1!!!!!!!!!()()()))))))))))))))))))))()(((&&&&&&&&&& 关于java中的画矩形,详细内容情进 沈阳有没有要DELPHI或BCB开发的人呢?我不要钱白干不行? 为什么我使用了Win32组件提供的工具栏控件,也不能。。。。 一个错误 挥泪大送分!!!(硬盘分区调大且数据无损的算法?)(详见正文部) OICQ的Ctrl+Alt+Z ////在一个工程中加入其它工程中的窗体,因为同为Form1所以要改名。保存后退出,但下次再打开此工程时会出错,为什么,怎么解决? 如何向外界表露被聚合的组件的接口?COM高手不要错过! 论述辛亥革命的历史意义 材料二 在北京人生活的洞穴里,用火的遗迹十分集中 灰烬堆积很厚 材料二证明了什么?他所证明的史实有什么意义 201不锈钢生锈怎么处理 一堂有趣的实验课400字400字~450字,不要超过, 科技小论文500字 液化现象的是?A从冰箱中取出的冰化成水B清晨河面上出现雾霜C冬天农家的屋顶上铺了一层霜D钢水烧灼成火车 辛亥革命为什么会失败?它的失败说明了什么?如何评价辛亥革命的历史意义? 证明具有教学实践经历的相关材料求范本 春天到冬天的英文?火车飞机船的英文? 辛亥革命有什么重大历史意义? 什么是个人的教育教学实践经历? 人生的启示作文450字 不锈钢分多少种类? 教学实践经历证明材料怎么写, 作文:生活中的科学 450字以上急,现在就要!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 关于实验的作文(400字左右 教学过程的本质是什么?(运用教育学来说明) 不锈钢表面拉丝、磨砂、喷砂的区别请不要所答非所问说对了给高分 记一次实验!要400字以上,苏教版六年级下册的习作4,要写一次实验,最少400字!明天就要交~ 中国共产党成立89年实践经验证明了什么? 不锈钢板磨砂面和拉丝面有什么区别表面看起来有什么区别 轻重工业在工业总产值表明我国当时工业化的特点是什么,结合 说明形成这个特点的必要性 如何在铁板上做不锈钢拉丝效果? 出炉的钢水变成钢锭,这是现象,需要热? 查找课外资料,结合教材内容简要说明马克思主义诞生的历史条件有哪些,它的诞生具有怎样的时代意义. 浇铸是指高温钢水变成钢半成品,这是什么(填物态变化的名称) 钢水变成钢锭 质量怎么变化? 用历史与现实材料说明中国人民选择社会主义道路的必要性和正确性近代史纲要的作业、、、、 初中科技论文200-250字请认真回答 钢水凝固成钢锭后,其质量 什么?为什么 各位高手请问竞彩足球的3串4, 亚光不锈钢、拉丝不锈钢和镜面不锈钢的区别 初一科学小论文 只要200字只要200字 什么是不锈钢?不锈钢有什么特点?不锈钢有哪些分类? 拉丝不锈钢和镜面不锈钢的区别 如何处理不锈钢在拉丝后变黑不锈钢在高温下拉丝后,时不时产生黑色的纹路,要如何处理才好啊? 塑胶原料的正牌料和副牌料是什么意思? 拉丝不锈钢怎样用全自动抛光机抛成8K镜面,一般的液体蜡行吗 试了几种液体蜡都达不到效果,不知怎么办?急, 关于环保节能的科技小论文500——600字之间 原料和新料是一个意思吗? 不锈钢做拉丝处理 和 镜面处理 两种工艺 那种磨损比较严重呢 求一骗 科学小论文500字急啊、求的是科学小论文500字以内 是鞋子哪部分是帮料 作文一次成功的尝试 400字 吃冰棍时,冰棍( )热,用钢水浇火车轮时,钢水要( )热. 二次三项式 什么意思 一次危险的尝试作文400字 为什么钢水铸造要高温出炉低温浇注 不锈钢的种类 有关“成功”的作文(400字) 怎么解决不锈钢生锈问题呢? 按规律填数2.4.6.8.9.后面交个是什么 作文《一次成功的尝试》400字结尾 怎么防止不锈钢生锈 辛亥革命的历史意义和对现在的影响? 电梯发纹不锈钢和拉丝不锈钢有什么区别,二者造价哪个贵啊 不锈钢生锈该怎么处理的好?我是做不锈钢门窗那些的.用201的材料.经常生锈,该怎么处理的好?酸洗指的是怎么洗?真的可行吗? 辛亥革命的历史意义和历史影响是什么? 从材料中可以看出这是诸葛亮给谁的建议?此建议是否正确?结合史实说明 材料二反映了什么形势?材料一:“今操已拥百万之众,挟天子以令诸侯,此城不可与争锋.孙权据有江东,已历三世,国险 304不锈钢做了拉丝工艺 放在海边用 严重生锈 有什么办法除锈和保护措施说明下 设备已经安装 不能拆下来处理的 用酸洗什么的肯定不行 用防锈膏先仔细擦一边 然后打蜡行吗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn