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

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

英特尔亚太研发总经理何京翔:数据化时代背后的智慧 云络网络科技CEO Steve Mushero:游戏行业的云运维 腾讯游戏运营管理中心总监刘栖铜:腾讯游戏云的理想与实践 一号专车产品总监曹景辉:LBS应用仍有无限的创新空间 昆仑游戏总裁张益豪:做好中国游戏的海外代理 游族首席运营官陈礼标:重点打造全球化IP 我是怎么利用微信月收入三万以上的! 我的Y Combinator黑客马拉松之感! 最炫HTML5 JavaScript框架Famo.us融资2500万美元 看板先驱David J. Anderson:看板方法拉动互联网时代敏捷变革 《近匠》增强现实开发团队LegendTech:AR技术现已加入15元豪华午餐 微软新技术:简单修改,手机摄像头摇身变3D深度相机 Black Hat USA安全隐患盘点及黑客奥斯卡颁奖 MDCC免费展位报名火热!数量有限,征集进行中 迪游信息科技CEO张晓雷:中日游戏面面观 百余款智能电视创意类应用参赛角逐 Top13 App新鲜出炉! 微信公众平台开发——如何保证access_token长期有效? 拼的就是速度!超快HTML5 2D渲染引擎Pixi.js 一周消息树:百度“涉黄”遭警告,网盘内容审核的四种方式 微信开发商现状调查:接口限制成主要困扰 行业需求多样是最大难点 小米:海外扩张需谨慎,信息安全或成最大掣肘 AMD FX系荣耀归来 或成大众新宠! 脑洞大开:《80天环游地球》同名游戏诞生记 2014微信开发者大会 最后30个参会名额! 林仕鼎创业产品“云校”正式上线:让教育个性化、多元化、均衡化 14岁少年开发者:伍兴云的智能家居“梦” Xcode 6 Beta 6发布闹乌龙,着重改进Swift语言 当API遇到云平台,开发者面临的新抉择! 《近匠》欧朋流量宝,工具类应用开发之道 《近匠》Bmob:免费无限制的公有云服务 MDCC应用征集最新动态:3D手游成热点、硬件种类丰富 有关上网设主机的问题(双网卡)(在线等) directx8中哪只函数支持播放内存中的声音文件 万分紧急!!!!!!先谢过! 那里又"绝世宝贝"下载? 哪位大哥帮翻译一句话!非常感谢!!!!!!!!!! 请问一个问题:用acdsee如何把点阵图转化成矢量图? cdonts在客户端发送附件,为什么失败? 第一行,第一列错误是什么回事阿? 怎样计算php里的时间差,mysql的时间差? 关于控制台程序 BYTE型怎么 输出到文件(急) 广州IT俱乐部活动讨论 OleContainer1对象如何使打开的文件嵌在OLE里面,而不是在外部打开DOC文档. 寻兼职程序员,开发一个的屏幕取词工具软件 那里有interdev下载?在线等 小弟初学vb.net,现有一题急需帮忙. oracle9客户端连接oracle816:tns 出错: 写文件换行,再按行读出 ASP开发工具的讨论!大家都用什么开发工具!DreamWeaverMX有没人用啊?看起来功能挺强的! 哪位大哥用过toplink连接oracle数据库的,请进 如何获得给定的文件的路径,比如文件"a.txt"发路径? (((SOS)))在WebForm中怎么样用程序隐藏dataGrid由属性生成器生成的按钮列(删除。。。) 高分求帮助 请问一般在VB中,该如何维护ACCESS数据库 asp的Response.Write的问题? 你们难道没遇到过这个问题? 大虾们救命!!!在线等待.................. 在次提醒!女孩不要看! ADODB.Stream 错误 '800a0bbc' 用sql的朋友们进来看看,问题不是很难,帮帮我。谢谢。 寻兼职程序员,开发一个的屏幕取词工具软件 怎么在sdk编程中设置editbox的初始值 大虾们救命!!!在线等待................. 如何能够屏蔽WM_SIZEING的消息. 关于DataGrid的问题 找房子的问题?有办法的帮个忙! sql server 与oracle的数据类型 充分发挥网络优势和自由精神,共同开发维护我们自己的网站 遍历表单中的文本框,为何只出现第一个值 请教如何在VB中调用我在SQL中建好的带参数存储过程? 天天泡程序人生,无心向学,欲罢不能,咋办? 怎样向一个数组里面写入数据,使这些数据满足下面的条件? 请各位看看这个网站www.green-net.com.cn,一家不错的深圳通信公司,现在急缺研发人员(包括软件,测试,用服,市场人员),待遇从优。有 updete数据窗口时新insert的数据出现重复问题?紧急! 关于textbox和回车的问题 高分求一个VB源码分析工具CodeReview? 如何得到注册表的网上学习资料?拜托各位大虾指点。 我想买一个bbs论坛! 寻兼职程序员,开发一个屏幕取词工具软件 XP的IIS怪事特别多,怎么就连不上.mdb呢? cshadow(影子)大侠能不能给我 重发一次上次的没收到 物理在空间运动到最高点时,急 我认为是 0 长石和石英有什么区别 花岗闪长岩与花岗斑岩如何区分在野外如何不借助工具区分二者 物理中有直线运动,平面内的运动,那么物体能不能在空间内做运动 正长石,石英,霞石,钾纳长石的区别? 科技发展利大还是弊大,请列举事例.过了今晚就不要了 当我在高速运动的地铁地铁在高速运动时 在身体不接触任何东西的情况下向上跳 这时候我是不是会飞到后面去 如何在显微镜下区别石英,长石? 关于原电池标准电动势同一电对,两种不同浓度的电解质构成的电池的原电池的标准电动势是多少?是0吗,那么平衡常数Kθ是多少,也是0? 为什么快速运动的物体的相片模糊 (我想知道物理原理)那能不能说由于物体运动太快 光子达到底片的很少 磁体上磁性强弱分布(),()磁性强,()磁性弱 电路有两个并联阻值是R的电阻,电源的内阻也是R,问其中一个电阻的功率是总功率的多少倍. 下列不属于自然资源特征的 A、自然资源的数量是巨大的但又是有限的 B.自然资源的质量在各个地区是有下列不属于自然资源特征的A、自然资源的数量是巨大的但又是有限的 B.自然资源的质 LED灯管电源坏了怎么办?我是做室内照明工程的,接了几个灯管的小工程,发现电源总会坏,而且电源坏了灯体没坏也要一起更换,非常麻烦和浪费钱,有什么办法能解决这个问题吗?我在网上查了有 原电池的电动势与什么有关?为什么?是如何影响的? 如何区分花岗岩与片麻岩与砂岩 LED灯管电源的好坏怎么判定? 原电池电动势的产生 如何区分片麻岩与混合片麻岩? 液晶显示器灯管怎么判定坏了?我的一台三星液晶显示器开一会,然后就黑了.但是电源灯是正常的,去问人说是灯管坏了,于是把显示器拆了,花了80块钱买了4根灯管,但是那个卖的人说,不一定是 西南为何如此干旱阅读答案.知道的进来... 花岗岩、长石石英砂岩和花岗片麻岩有什么共同点和不同点? 有两个电阻R1=10欧,R2=5欧,当它们串联在9V的电源时,把它们并联在同一个电源上,电路总功率是多少? 暖手宝里有一个类似日字形状的东西,这是电极式的暖手宝么我见网上说电极的容易爆炸,电极式的就是摸着是两根柱体,我的摸着就是一个日字形状的东西,也没有固定,网上说电热丝是环形的, 科技发展利大还是弊大?请举几条具体事例 科技发展利大的事例 电池标准电动势Eθ,电池电动势E,标准电极电势之间关系是什么啊能斯特方程里面E=E(标准)-(RT)/(nF)ln([Zn2+]/[Cu2+]),所求得的E是哪个电动势?电池标准电动势Eθ还是电池电动势E? 将4g硫粉与7.56g铁粉混合加热使之充分反应后,使反应后的固体物质与足量的稀盐酸反应.(1)标准状况下可以生成气体多少升?(2)实际所得气体明显少于上述所求体积的主要原因是多少?(3 石英砂岩与长石石英砂岩的区别及含量各是多少? 关于科技发展利大的例子 将8.4g的铁粉与3.2g硫粉均匀混合,在敞口事关中加热,充分反应后,待残物冷却后加入盐酸那么理论上可收集到标准状况下的气体为多少? 光照到物质上,其强弱跟物体的温度没有关系.是对的还是错的 科技发展利大的例子 将4克硫粉和10g铁粉混合加热,使其充分反应,问:(1)可生成硫化亚铁多少克?往反应的混合物中加足量盐酸,可生成气体多少毫升?这题中回答第二问还有一题,如何除去二氧化硫中的二氧化碳, 关于曲线运动,为什么质点做S型曲线运动时在S的中间点怎么没加速度 石英岩和石英斑岩的区别在哪里? 中东的 匮乏,其主要原因是中东地区 、 、 . 质点的切向加速度,法向加速度及加速度哪些为零哪些不为零?匀速直线,曲线运动,变速直线,曲线运动 水沫子与玉石英岩的区别,石英岩主要成分是什么?,石英岩有一连串的气泡么? 中东地区最缺乏什么 中东地区缺水原因 闪长斑岩如何野外编录描述?全风化与强风化 为什么鱼能在水里游来游去 1w正白光LED大功率LED灯...输入电压3.2-3.6v.我现在要用12V电源供电...1w正白光LED大功率LED灯...输入电压3.2-3.6v.我现在要用12V电源供电,要串联多少个1w正白光LED大功率LED灯?才能稳定在12V的电源下 辉绿玢岩和煌斑岩的区别? 为什么鱼在水里一直游来游去感觉好像很不安 中东地区的国家为什么缺水,比如阿拉伯国家他们为什么那么缺水,他们受什么气候的影响呢! 电视上说的会爆炸的暖手宝是什么样的暖手宝 什么类型的 鱼儿在水里游来游去把句子写生动 中东地区最缺水的地区是?哪一个地形区? 请问,花岗质碎斑岩属于什么岩类?请问,花岗质碎斑岩属于什么岩类,成分、结构、构造、成因是什么?那么花岗斑岩、花岗质斑岩、碎斑岩呢?有什么区别? 帮我出十道《海底两万里》的名著阅读题 LED模组 串联贴3个2835灯珠 电压3.6V,电流60mA.使用12V的电源.改用多大的电阻?一个灯珠一个电阻 花岗岩和斑岩,哪种更硬? 《海底两万里》名著阅读题人教版..急1、《海底两万里》是法国生物学家凡尔纳的三部曲之一,他的另两部作品是、().  2、《海底两万里》主要讲述()号潜艇的故事.凡尔纳的小说之所 12V直流电源上用1个3.2V,350MA的LED怎么用?12V直流电源上用1个3.2V,350MA的LED电源电路图样接? 请问:花岗斑岩中长石斑晶长轴呈定向排列的可能原因有哪些呀? 光的强弱和什么有关?我们视觉感觉到的强光弱光,是光的什么性质决定的呢? 50W电灯和100W电灯所发出的光子本质区别? 使用12V电源,3个3W的LED灯珠串联,每个灯珠电压3.5v左右,电流700HA、要用几W几欧电阻、多谢! 花岗斑岩属于岩浆岩吗
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘