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

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

美国碰壁欧洲得意 华为获CERN青睐 应用数据分析新标准:Flurry增应用崩溃分析功能 Twitter被黑客入侵,25万用户信息可能被窃 16亿美元超级计算机项目助力解读人脑 卡巴斯基发现新型Android恶意软件 可入侵Windows 谷歌发布基于B-Tree的C++模板库 开源产品系列:高性能Web框架Zend Framework LiFi是否会取代WiFi? 1月浏览器排行:IE10突破1% Chrome连续3月下滑 Wine让Android也能运行Windows软件 Cory Ondrejka,是这位工程师拯救了Facebook! 三星争夺企业市场的三大痛点与对策 Xcode更新至4.6 支持iOS 6.1 工程师揭秘:NVIDIA如何锻造Android掌机 VMware掌控Puppet 老用户会被锁定吗? 试图领导创新:三星创新中心11亿美元建基金 基于WebRTC Chrome与Firefox实现视频通话 将OpenStack私有云部署到Hadoop MapReduce环境 Web设计师必备的10款最佳排版工具 诺基亚CEO谈平板计划 Android为候选系统 244亿美元!戴尔公司正式完成私有化 对抗苹果 Facebook或推Find My Friends应用 前谷歌工程团队负责人:如何打造一个完美的产品 好消息!Google Drive可存储共享JavaScript等网站 Android Rivers:用Kotlin语言写出的新闻应用 辞旧迎新 老牌游戏开发商的移动进化之路 iSuppli:硬盘市场持续萎缩 大数据应用成重要市场 全球最大校园Hackathon:失败后,你能学到什么? 走进Evasi0n,越狱黑客如何拿到iOS权限 提升服务扩展性和冗余的八个编码方向 分析数据预测未来?数据挖掘绝不是大公司的专利 就剩50分了,不好意思。我今天装了个wingate,刚上了一个小时的网,再wingate的防火墙里发现许多人扫描我,这是怎么回事情?有没有危险啊 我刚学数据库,大家推荐几本好书吧~~~~~~ 关于文件打开时的问题!! 如何捕捉异常? 请问现在除了Radiate.com还有没有广告条挣钱的网站了? 我calligrapher给分 ###如何用PB写一段程序,调用数据库存储过程sp_upgrade,输入两个字符串参数,返回一个布尔值(注:在存储过程中的两个输入参数为@sp_test 谁能给我推荐一本delphi开发数据库应用的好书 我calligrapher给分2 如何在一个超链中产生两个事件一个超链到AVI,另一个使计数器加一? 我calligrapher给分3 delphi中如何实现导航式的界面? 怎样判断一个对象已经unload或load? 119!119!有谁能救我?????? 我感觉有一半的人已经疯了~~`~~真他妈的~~~~~ 如何修改系统环境空间的大小? ListView Report styte,想在一个item的一个subtiem里显示check标志? 关于图片的问题,小意思?不看后悔 按试用期的工资算,年薪70000,在上海算个什么水平 拿位大侠有开发web手机短信平台经验。 请问那里可以找到学习C++Builder5做数据库方面的资料,我要基础一点的,谢谢! 高分征答:“停用了‘调用取消’”是什么错误? 如何得到本机上的OUTLOOK的帐号的EMAIL地址? 大家骂来骂去不爽~~~~ 我转两个笑话吧~~~~ ###Profiles使Powerbuilder与后台数据库联系起来。根据数据访问的不同,Profiles应用的接口又分为那两类?### EVC中的CFileDialog怎么不能选择文件啊? 备份数据日志时出现下面提示.请高手指教 对《程序员》的建议,大家都来说说!!! 100分!!!!!在Win32中用那个函数可以打开指定的字符文件,如指定code.out,怎样打开????? 安装VS.NET失败,不想重装系统,怎么回事? 如何退定CSDN的邮件? 救命啊!小弟遇到一个非常奇怪的问题 请问,delphi6的中文版有吗? 请问目前比较流行的数据库对中文表及中文段的支持情况 薪水问题求教 VB调用动态链接库的问题,HELP! 高分求教,MyODBC!!!!!!!!!!!!!!!!!! vc++ 写了一个vb控件,如何让客户端打包下载 关于如何在linux下运行xml的程序的问题 急!请问那为大虾知道wast这个软件啊? 求救:用VC怎么调试程序(怎样设断点) 各位高手:>>>送分问题.....谢谢!! 关于安装程序.... 在Form上放一个Memo,响应Form的onMouseMove时,为什么在Memo上移动鼠标,事件中的传递的参数Sender总是Form而不是Memo? tc++中怎样使用bitmap 送分了!! bcb报表中只有richedit可以自动折行,如何解决? 如何把asccii字符串转化为unicode形式的字符串??? 高手请帮帮我吧 打印RichTextBox 的内容时,如何设置页边距? 作文题目“我的青春我做主”的800字作文.800字作文 大队委竞选演讲稿 1000字 小亮家今年承包的鱼塘到期了,共抓起鲫鱼和鲢鱼500鲢千克,共卖了2800元,已知鲫鱼和鲢鱼每千克分别为6元和5元,则鲫鱼和鲢鱼各多少千克? 《我的青春我做主》的初中作文《我的青春, 竞选大队委演讲稿,400字左右还有竞选中队长.有自我介绍等、 王叔叔在鱼池里放养的鳊鱼比鲫鱼的4倍少80尾.鳊鱼鲫鱼一共放养了200尾,鳊鱼放养了多少尾? 介绍一种物品作文(说明文,100 字.) 以我的青春我做主为题写一篇作文,600字左右,一定要原创, 3条鳊鱼与5条鲫鱼的价格相等,每条鳊鱼比每条鲫鱼贵1.2元.每条鲫鱼的价格是多少元?要算是滴 最好还要解说还有一道题:大小两瓶油共重3千克.把大瓶油的4分之1倒入小瓶后,大瓶油与小瓶油 说明文作文50字 李芳同学被评为"金星少年"的光荣称号.改病句```````````````````````````````` 初中写开开学典礼后有感 作文600字听了校长在开学典礼的发言 你对新学期的的感触 想法. 说明文作文英语100词以下+中文 (二) 21%我从小在四川农村的外婆家长大.有一天傍晚,我随着大人们到大田里去干活.突然,狂风骤起,大雨降临.大人们怕大雨把我淋坏了,让我先单独回家.小小的我决定抄近路回去.在吹哨子一 一批零件,甲单独生产要15小时,乙的工作效率比甲高百分之50,甲乙二人共同生产了4小时,乙比甲多生产了28零件,甲乙二人继续共同生产,完成任务时,乙生产了多少个零件?快.急.列式子 急求有关电脑说明文的英文小作文100个词左右是写有关电脑的说明文1.计算机是20世纪最激动人心的发明,她有许多种类型.可以存储信息,需要时,随时取出2.计算机经过30多年的变化,体积越来越 小明家有一个鱼塘,若按7:4的比例来放养鲤鱼和鲫鱼,鲤鱼苗就比鲫鱼苗多1200尾.小明家应购买多少尾两种 冬天早上起来跑步,是跑步回来再洗脸呢还是先洗脸再跑步呢、?跑步有时出汗,出汗回来脸上不是很舒服还是要洗脸,但是冬天太冷,紧接着洗脸又不是很好. 慰问老人发言稿400字 鲫鱼苗在哪买 甲乙丙三人同时合做一批零件,甲6分钟做5个,乙每分钟做0.75个,丙做2个要3分钟,谁的工作效率最高? 300字发言稿! 刚孵出来的鲫鱼苗吃什么 本题改了:做一个零件,甲要4分钟,乙要8分钟,丙要6分钟,甲和乙和丙的工作效率比是什么?甲乙丙工.看清楚,本题已更改,三个人的:2.思路,怎么考虑的,怎么求(1)做一个零件,甲要4分钟,乙要8 冬冬有1角、5角、1元、5元的钱币各一张,每次取两种,共有几种不同的取法?急,明天交 把一元钱换成角币,有多少种换法 (人民币角币的面值有五角,二角,一角三种) 把手浸入水中,水对盆地的压强将会怎么变化金星同学早上起来打了半盆水准备洗脸,这时脑子中突然出现了一个问题,当我把手浸入水中时,水对盆底的压强将怎样变化(变大 变小 不变) 班会课上,我们通过并讨论了创建“书香班级”的活动方案.(修改病句) 竞选体育委员的演讲稿300字 金星同学想到:当他把手浸如脸盆水中时,水对脸盆的压强将怎样变化?A将变大B将变小C保持不变D条件不足 同学们通过并讨论这次主题班会活动方案.修改病句 若按7:4的比例来放养鲤鱼和鲫鱼,那么鲤鱼苗就比鲫鱼苗多1200尾.问:这两种鱼苗各购买了多少尾 求一篇400字的《我的家》说明文求一篇400字的《我的家》说明文求一篇400字的《我的家》说明文求一篇400字的《我的家》说明文求一篇400字的《我的家》说明文求一篇400字的《我的家》说明 赞美太阳的文字 200字 这次班队会腰充分发挥民主讨论 修改病句 如果按7:4的比例来放养鲤鱼和鲫鱼,那么,鲤鱼苗就比鲫鱼苗多1200尾.这两种鱼苗各有多少尾 童年趣事200字 大队委员竞选演讲稿200字里上急!大队体育委员 若按7:4的比例来放养鲤鱼和鲫鱼,鲤鱼苗就比鲫鱼苗多1200尾.小明家应购买多少尾两种鱼苗 我的青春我做主作文初一水平的急用!500或600字左右 我要找一篇“童年趣事”的作文,400字就够了.急 若按7:4的比例来放养鲤鱼和鲫鱼,那么,鲤鱼苗就比鲫鱼苗多1200尾,问:这两种鱼苗各购买了多少尾? 我的青春我做主 作文 有许多1角、2角、5角的纸币,要从这些纸币中取出1元,共有( )中不同的取法 买了两种鱼苗,若按7:4的比例来放养鲤鱼和鲫鱼,那么,鲤鱼苗就比鲫鱼苗多1200尾.问:这两种鱼苗各购买了多少尾? 我的青春我做主论文要1500字!哪里有啊. 用退一步海阔天空写一篇作文,400字就够了.注意:是小学生活类的,最好是你最近发生的.可以给一个大纲.让我有点头绪, 小明有1角、5角、1元的硬币各10枚,要取出2元,共有多少种不同的取法? 我最敬佩的人演讲稿,700字左右 书香班级理由怎么写 (1、)六一班的评议成绩是全校最好的班级.(修改病句)(2、)这次期末考试,我非争个前三名不可.(改为肯定句) 我最敬佩的人250字 书香班级怎样布置 竞选大队委的演讲稿 500字要提到:在班级组织了哪些活动,有哪些效果.我在班上发过报纸、杂志,效果还不错多写一点亮点 什么助人为乐啊等等新颖一点 300字的作文 一个让我难忘的人或一个让我敬佩的人.提纲也行 我想要个非常淡雅 而且很有书香 还有个性的班级名称! 小明家承包的鱼塘到期了水抽干后捕到鲫鱼和鳊鱼共50千克卖的2800元已知鲫鱼每千克6元鳊鱼每千克5元两种鱼各多少钱 我的青春我做主初中作文要中心思想,不要复制粘贴的长篇大论,主要是讲什么?要作文的步骤,不要范文…… 为什么要有书香班级 最近鱼塘里的鳊鱼死了而鲫鱼没死这是为什么啊
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘