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

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

利用光子 耶鲁大学研究人员让量子计算机离现实更近一步 技术为王的云计算会让IT部门消亡么? 从Discuz到APP:安米移动社区转化工具 覆盖全领域:Google、Facebook、Twitter等大师的最佳推荐 苹果CEO宣布更改保修政策 并向中国用户道歉 拒绝使用现有Web组件的6个愚蠢理由 Github宣布支持SVN方式访问 iPad,正在改变什么? Go Mobile:行业大牛谈行业应用开发 亚马逊Cloud Drive新增文件同步功能 对抗Dropbox 35万奖金发放,BlackBerry 10大赛奖项揭晓 超越Google Apps:排行榜前10的相关云应用 荣耀终将消散 全球第一台千万亿次级超级计算机退役 谷歌已推免费Android和iPhone版Quickoffice,微软你呢? 用于响应式设计的9个CSS技巧 微软Surface Pro正式登陆中国市场 售价6588元起 岳雷:Windows Server 2012虚拟化性能提升巨大 陈健:Windows Server 2012让企业轻松管理IT 智能手机:革命已经波及到阴间 兄贵草泥马:重口味单机移动游戏为什么能火? 最炫HTML5框架Famo.us 将免费面向开发者 MySQL到NoSQL:数据的重思和查询方式的转换 程序员心髓:移动应用API设计10大技巧 Netflix公布个性化和推荐系统架构,3种类型作业通实时 从SendCloud到搜狐云 扎克伯格的败笔?Facebook Home可能无家可归 走进eico design,仰视设计师 乔布斯顾问承认苹果的命名糟透了 罗永浩:一百万年薪!招聘软件研发总监 开源的:helios移动应用后端服务框架 IE11将支持WebGL 或将OpenGL映射到DirectX 如何在当前目录下调出一个CHM格式的文档? 为什么动态增加的WebBrowser1.Align不能为alClient啊? 怎样通过代码实现CTRL+C和CTRL+V的功能? 有两个问题要问,很难的哟,谁来挑战一下!! 在dll中能不能声明一些类,供外部程序调用?能给个例子最好; 各位,请帮我看看! weblogic6.1中配置好了oracle9i的连接池,名为oracle9,但是编程工程中如何使用这个连接池,希望答复!! MSXML2.XMLHTTP 是什么组件? 颜色填充 我要用到GPRS的知识,了解者请赐教! 请问在程序运行期间执行label1.text="***"怎么不变啊! 大家帮我看看,为什么不能选择divx压缩? 打开excel文件时提示“重载open方法未获得1参数” 帮忙写报表查询,我搞不定,请求帮忙!!!比较复杂!!!! 自定义标志的问题 着急! 今天在CSDN上终于变成三个绿色的小三角了,高兴……散分(前十位每人10分)! 如何把一个文件中text的值传到另一个文件中去? 路由器如何设置?? apache2配置文件问题,请大家指点迷 PPS文件用什么软件打开,谢谢! 填充颜色 svhost.exe程序错误 求HOOK例子 php得到xml文档中的中文无法正常显示问题 高手请指教一下思路!!!!!!!! 奇怪的乱码问题!急急!在线等待! 填充算法 今天我过生,放分(来者有分) 日期时间换算问题 填充算法 哪里可以下到SpatialWare for SQL Server 的解密文件 怎么拖动一个控件拖动一个窗口 tomcat4的server.xml配置文件是否有问题,请大家帮忙! 填充算法 谁能给我JDK1.4下载的地址啊?谢谢了,TOMCAT的也要! 请问各位同仁,如何关闭SHELLEXECUTE()打开的应用程序。 有没有图形化的TrackBar! 填充算法 急问:中文库表 大家看看排序有什么问题? 各位大侠:在sql语句中如何滤除查询后的重复字段!!本小妹在线等候!切急!! 颜色填充算法 颜色填充算法 Treeview中如何得知所有子节点的数目(不展开节点的前提下) 重分求取Rabin-Miller算法源码及Lehmann算法源码!!!!!!!!!!!!!! !急问关于XML问题,在线等待,100奉送 redhat9 linux显示中文的问题?? 不知道这样的问题,大伙是否遇到:使用ADO.net执行比较复杂的统计操作(运行时间为15秒左右)使用try{}catch{}捕获到摸民气秒的问题。比 关于数据库的移值 VC6好像不支持ADO啊?是不是? 白眼狼的定义是什么 我要最全面最正确的解释. 为什么《千字文》说“果珍李柰,菜重芥姜”? 搬迁英文怎么读 翻译为中文读.removeal 英语翻译,____________(在·······对面) `-` 不懂的 空集空集,是不含任何一个元素,那他在数学里有什么意义?它既是任何一个集合的子集,也是任何一个非空集合的真子集.举个例子或其他方式用口语化说明,它既然是一个元素都没有, 空集的集合与空集是什么关系,这段听不懂啊 当A包含于B时,为什么要讨论A是不是空集?就是不懂 白眼狼比喻什么样的人 别人说你是白眼狼什么意思? 别人说你是白眼狼是什么意思? 中国军方就日舰机干扰我西太演习提出严澳骑车者频遭喜鹊袭击 上演“愤怒小鸟安倍将亲自为救人中国留学生严俊颁发感“甲壳虫”乐队主唱列侬儿时故居48万日本一男子弑母弃尸 藏尸冰箱月余终败日国会议员山本太郎向天皇递交书信 或韩国防部:暂不签署《韩日军事情报保护韩资料称日反韩示威3年激增10倍 口美华裔留学生派对后公寓猝死 疑酒精中日本“菜鸟”教师多:不会点火柴不敢拿纽约遭飓风袭击一周年 数千灾民仍无家一位85后基金经理的口述:我这10个房产过户 暂时停办十大经典战役,看成吉思汗军事思想消费类股权众筹,会成为屌丝逆袭的神器人生感悟 > 妈妈是什么?爸爸是什么将猫咪“塞进”世界名画,俄罗斯艺术家那么问题来了:\"学挖掘机哪家强\"欧洲P2P借贷巡礼:Zopa历史教科书,你选台湾的还是大陆的?来一次对耳朵的赤裸\"告白\"两部委:不限购城市首套房最低首付款比至高学院我的玄异生存世界太子篡位记末日足迹娱乐玩童江山如此多娇:累断腰万象时空的任务录孤岛求生之重生狂蟒杀戮之镰真武皇途神级巫医在都市惠山森林公园旅游虎跑山旅游西王母瑶池旅游昆仑神泉旅游烟台市体育公园旅游美丽华商场旅游六福村主题乐园旅游垛田风光带旅游永庆寺旅游燕子洞旅游立法会大楼旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘