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

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

Atmel CMO Sander Arts眼中的创客运动 Unity“三巨头”:全心全意为开发者服务 全球移动广告现状报告:哪种平台、应用最赚钱? 《近匠》Smart Wallit,钱包找不到了?给它“打个电话”吧 Mozilla新CTO:JavaScript、 Firefox OS专家Andreas Gal 李彦宏发布百度大数据引擎,及与谷歌、亚马逊等类似项目对比 大数据领域,实时打击欺诈犯罪的4个战场 一周消息树:谷歌Project Ara,将开启下一个智能手机时代 数据恢复服务商的6个最佳实践 【走近讲师】谭晓生:魔高一尺道高一丈,360基于大数据的网络攻击检测 一周热点:摩尔定律让位于贝索斯定律 阿里巴巴集团CTO王坚确认出席第六届中国云计算大会 【走近讲师】青云甘泉:混合云的构建及其对企业的帮助 RadiumOne创始人兼CEO因家暴被公司解雇 3D打印狂潮:可检测皮肤疾病的低价手机显微镜 浅谈导航设计,开发者必备的十大实用技巧 【云先锋 41】上海越诚:基于云服务的建站类iService软件超市 董西成:Hadoop将在高速发展和完善中扩大优势! 【走近讲师】 华云数据郁珉:公有云市场八仙过海 价格不是唯一标准! Facebook、Twitter、Google移动广告之争 开发者的黄金时代=运维人员的恶梦? 研发团队平稳度过“从小到大”并非易事 诺基亚品牌手机不久将消失 Stephen Elop回应不是木马 看七家科技公司Logo的最初模样 移动UI框架Fries:私人定制最Sexy的用户界面 必须Mark!最佳HTML5应用开发工具推荐 百度技术开放日感悟:看百度如何获取大数据时代的“船票” 谷歌亚马逊微软的烧钱游戏 拉手网CTO官冲:团购网在大数据应用上的探索 究竟谁真正关心比特币,不妨看看基于大数据的百万条推特分析 Firefox 29正式版:高度自定义模式、全新菜单和Australis UI 学习DELPHI用铁道出版的乔林《参透Delphi/Kylix》 如何? 请问是否有比较简便的方法可以知道,程序中哪些变量定义完后根本不用? 按钮提交并链接不同页面的问题。 简单的问题 请教VC++高手:在MFC中,如何把剪贴板中的位图按原比例打印出来? 分不够再加! 怎么样在vb中读取bmp的位图信息,将图中所有黑颜色的象素 谁在20分钟内答出以下问题能拿高薪 如何修改注册表的键的默认键值? WINXP开始运行宽带播号程序缓慢,什么原因? newwish2 给我一个例子,邮箱:make_a_wish@163.com!!!着急呢!! evc4.0中文显示的问题! struts--html:select 为何出不来? 讨论:关于WinXP下开发的COM+的分发问题!! 菜鸟的小问题!! 一个关于东芝笔记本的故障 请问JBuilder错误提示:cannot access directory javax\mail at line 7, column 1 CSDN的速度越来越慢了,来这里的高人也越来越少了! 有没有DOS很熟的仁兄?纯DOS下和WIN NT4.0联网 小小问题!!! 困扰我多时了。。。 sybase 在程序中连接的问题。急,我咨询Sybas公司也不行。 按钮茶馆开张啦,有闲的进来聊天吧~ 小問題 PhoebusApollo(sunny) 你说要开贴,又没分,我有,给你100分,进来领吧!呵呵,不用谢!:) 关于DBGridEh排序的问题,急急急!!! ora-12224错误,tns no listener错误 !在线等待 ,急~! 求助jb9的破解 报表问题,急呀,救命呀~~~55555~~~~ 500分求解决一个问题 在线等待 解决立即给分 2003下为什么我的声卡不能用? 在程式AAA.PRG中如何修改表的字段的類型,比如字段C類型改為N類型??很急!!! 为什么有时候成员函数或变量显示不出来 救命!我在程序中使用webbrowse控件………… 在线等待。 也许是一个很简单的问题! 连接mysql出错 寻关于工控的中英文对照资料 想在暑假打工(计算机方面的)需要什么条件啊? 关于SQL SERVER的疑难问题!来者有分!(在线等待!分数不够可以再加) MTS与线程——高分相赠!!!! 来看看啊,告诉我再哪里下就给分啊~~ 大对象问题,所有书都是这么说的,可是都作不成功? 如何指定tquery中的某一行? 如何通过API发送翻页按键给控件? 在jbuilder 中 不能通过 创建Ejb Tester对EntityBean进行测试吗?SessionBean都可以的 如何在ie中点右键获得这个ie窗口的window Text以及其主框架的URL。 关于Kdevelop开发 大家讨论一下项目负责人到底该赚多少钱(年薪)? ★★★★★如何在文件下载完毕后自动关闭浏览器??★★★★★ #### 关于CWebBrowser控件 #### 兄弟我要做一个网上银行系统,需要做压力测试,各位有过这样的经验吗??怎么来测试,用什么工具来进行并发访问压力测试? 兄弟我要做一个网上银行系统,需要做压力测试,各位有过这样的经验吗??怎么来测试,用什么工具来进行并发访问压力测试? 菜鸟问题,在线等待,如何让JList显示带gif的文字啊? 王码五笔86版怎么造词我一直用86版五笔,像万能呀,极点呀也用过,但不顺手,像四码词86版自动上屏,但其他的还得按空格,但我不会用它造词,有点不方便, 消除业障是什么意思 农民工进城务工前后的思想观念的调查分析3000字以内的,紧紧围绕问题说明,不要答非所问?感激不尽! 近在咫尺中咫的意思 第4和的7题怎么写啊! 历史整理好了知识点,在一个本上,怎么背才能高效率的记住 及字怎么打啊,我用的是王码五笔啊 7年级上册数学195页第2题和196页第4和11题的答案 已知角aob是45度,oc为一条射线,且角aoc与角cob等于2:3,求角boc的度数 已知直线l过点(1,2)且与两坐标轴正半轴分别交于A,B两点求三角形AOB最小时直线l的方程.(O为原点) 什么是业障? 为什么农村人们都要进城务工? 语音四要素对于现代汉语普通话语音的重要意义 第二题,第四题,第七题, 已知AOC=40 自O点引射线OC 若AOC比COB=2比3 求OC与AOB的平分线OM所形成的角的度数 材料科学基础四要素包括材料的化学成分、组织结构、( )和材料性能.A、合成与加工 B、材料的制备 C、显微缺陷 D、材料失效到底是A还是B呢?一直很让人犹豫. √βф赢政打一生肖雄风镇山林健步驰千里打一生肖Y(^_^)Yβё跟着港哥走有肉吃电l3288037l46 如何组织一场三局两胜制的男单网球比赛?比赛为男单比赛,从进场开始描述,比赛中涉及的规则以及考虑比赛过程中可能出现的问题, 语音四要素在汉语中有什么作用 虚功原理小知识点 急求各种有利于观点 “农民工不该进城务工” 的相关数据!用于辩论赛 新东方万泉河校区 的201教室是多少人上课的教室啊?是教室能装多少人就有多少人上课么?这个教师能装多少人啊? 赢政是什么动物 比赛采用三局两胜制,如果甲队想获胜,他们应该怎样安排应对策略? 在∠AOB内过O点引出30条射线,这样能组成个角. 小明和小张两人做石头,剪子,布游戏,规定:比赛规则为三局两胜制,如果两人在每局比赛小明和小张两人做石头、剪子、布游戏,规定:比赛规则为三局两胜制,如果两人在每局比赛中获胜的机会 衣服上有个小线头,太短了想系个死扣系不上,怎么办,怎么把它收住?那地方是这么一根线缝过来的,发现头上这个地方没收住,是松开的,若不管它的话后面缝的部分很容易就连锁反应依次跟着都 已知钝角∠AOB,点D在射线OB上...50悬赏伺候已知钝角∠AOB,点D在射线OB上.(1)画直线DE丄OB.(2)画直线DF丄OA垂足为F.要图, ANSYS如何生成log文件?log、logw、logd为后缀的文件有什么区别? 有线电视线头怎么安装?有线的线和有线头怎样衔接是最好的,可以让电视很清晰 羽毛球比赛三局两胜15分制一场多长时间,21分呢? 英语翻译FLST,5,39,6,ORDE,7 FITEM,5,1 FITEM,5,-34 FITEM,5,36 FITEM,5,40 FITEM,5,44 FITEM,5,48 FITEM,5,52 VSEL,s,,,P51X 请问这个Log文件什么意思,用命令流该怎么表示? 针线盒里面的线乱了该怎么办?可以用很乱来形容.我家的针线盒里线全乱了,弄半天也没弄开,我这人有自我强迫症,一想起来线这事,心里就别扭,睡不着觉,必须得想出来个招,不然我就别想干其 如何对现代散文进行解读与散文教学中存在的问题 问什么听课的时候觉得懂了, 已知OC⊥OB,垂足为O,∠BOC-∠AOC=60°,试求∠AOB的度数标准解题格式来做 如何进行科学有效的教学评价 Log File:D:\ANSYS Inc\install.err我在安装ansys时也遇到了这个问题,请问你有怎么解决么? 已知OC⊥OB,垂足为O,∠COB与∠AOC之差为60°,试求∠AOB的度数 拔河比赛有五个参赛队采用三局两胜要怎么分 ANSYS的工作空间里没有后缀为log的文件,如何生成后缀为log 的文件?后缀为log、logd、logw的文件有什么区别? 省去图形,以知条件不变,OC垂直于OB,垂足于O,角COB与角AOC之差为60度,(几何题)试求角AOB的度数!~过程写清楚! 请问:“咫尺”中的“咫”是什么意思? 已知三角形AOB和三角形COD都是等腰直角三角形,AO=BO,CO=DO,三角形AOB可绕着O顺时针旋转.(1)如图1,当点A,O,D在同一直线上时 请指出下列关系:①AB与CD:___;②AC与BD:___.(2)若△AOB旋转到图2 ,图3位置时, 我现在高二了,在上物理的选修3-1,感觉听课听得懂,但是做题就不会做, "尺咫"是什么意思 发个链接 为什么听课听得懂,要做题就不知道了,感觉很模糊 “近在咫尺”咫什么意思? 赢政的父亲是?拜托各位大神 已知∠AOB=45°,OC为一射线,且∠AOC:∠COB=2:3.求∠BOC的度数.提示:请先画图,然后求解.画图时,考虑是否需要分类讨论) 第七题,角3角4那个! 赢政是什么人 如图,射线OC把∠AOB分成两部分∠AOC与∠COB,求∠AOB的度数.如图,射线OC把∠AOB分成两部分∠AOC与∠COB,且它们的度数比为3:2,OD是∠AOB的平分线,且∠DOC=10°,求∠AOB的度数. 一个大于0度小于180度的角的补角有无数个?对还是错 四条射线最多能画几个钝角?最好把图画出来 历史怎么听课才有好效率 把3KG水加到盐水中,得到浓度为10%的盐水,再把1KG盐加到所得到的盐水中,这时盐水的浓度为20%.原来盐水的浓度为多少?和说明 第4和7题 x^2-8xy+7y^2 因式分解 曝孙杨因女友不满赔偿金才报警 托人办印度火星项目负责人祈祷发射成功 称导美国白宫微博有“水军” 专为奥巴马“印度火星项目负责人祈祷发射成功 称导上海友谊路现54只探头 或为科技公司最大航空诈弹案今宣判 被告人开房被查当当网店庆闭幕周 万种畅销童书5折疯三部委:严禁医疗机构向孕妇等推销母乳安徽宁国网友募捐被叫停追踪:1名重症三中全会前瞻:新一轮改革坚持中国特色2014放假安排最早12月定 “只调越南总理积极推动TPP谈判 争取年内印度火星项目负责人祈祷发射成功 称导大众成德国薪酬差距最大公司 高管薪酬两名法国记者在马里遭绑架遇害 遗体抵商家应对中央禁令推便宜年历 省出回扣日本官员爆料:自卫队军演目标是攻击中一客机在蒙特利尔机场失火被迫疏散 致不想脱外套 美国3岁女童被托儿所长活日本一17岁少年将伙伴推下河 称没有在柬埔寨感受“今日中国”460万,10天要回来(保障农民工工养书又学书面花朵朵指间舞(我们的庙会)两张扶贫卡上的“精准账”(新春走基层坚守,我们为你点赞发布春节赴泰游提醒(信息服务台)全民大联欢 年味别样浓(移风易俗气象留住甜美记忆(我们的庙会)万家欢乐 共祝美好新春走基层 神州日日新图片报道彝家新春味简办红白事 树起新风俗(移风易俗气象江山文气(中国画)喜鹊回家传统文化能“触摸”祝福·感恩·陪伴(大地漫笔·编辑丛谈爱上诗村诗路开超萌!鸡年流行头上长小鸡(图)西关人家过年必备马蹄糕 “步步高升”谢震业:“节奏起不来,回去找找感觉”
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘