如何在VB中调用VC编写的DLL

【菜科解读】
一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。
相对而言,第一种方法对VC编程者的要求最低,但要求你的伙伴进行配合,我推荐这种方法。
先说说VC++的编程。
首先在VC++中生成Win32 DLL工程。
在这个工程中添加几个函数供VB用户调用。
一个DLL中的函数要想被VB调用,必须满足两个条件:一是调用方式为stdcall,另一个是必须是export的。
要做到第一条,只须在函数声明前加上__stdcall关键字。
如: short __stdcall sample(short nLen, short *buffer) 要做到第二条,需要在*.def文件中加上如下的几行: EXPORTS sample @1 这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每个函数都不一样。
注意这里的函数名是区分大小写的。
至于你说的需要传递大量数据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给VC(至于如何在VB中编程我会在下面介绍)。
就象上面的例子,nLen是数组大小,buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。
至于输出图形,可以生成WMF或BMP格式,让VB调用。
不过,我认为也可以直接输出到视窗,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一致才行)传给VC就行了。
而VB的AutoRedraw属性必须为False,在Paint事件中调用VC的绘图程序。
再谈谈VB的编程。
VB调用DLL的方法和调用Windows API的方法是一样的,一般在VB的书中有介绍。
对于上面一个例子,先要声明VC函数: Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer, buffer As Integer) As Integer 这里mydll.dll是你的dll的名字。
你可能已经注意到了两个参数的声明有所不同,第一个参数加上了ByVal。
规则是这样的:如果在VC中某个参数声明为指针和数组,就不加ByVal,否则都要加上ByVal。
在VB中调用这个函数采用这样的语法: sample 10, a(0) 这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是a(),而必须是要传递的数据中的第一个。
这是VB编程的关键。
下面在说几个可能遇到的问题。
一个问题是VB可能报告找不到dll,你可以把dll放到system目录下,并确保VB的Declare语句正确。
另一个问题是VB报告找不到需要的函数,这通常是因为在VC中*.def文件没设置。
第三种情况是VB告诉不能进行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节。
必须保证VB和VC的参数个数相同,所占字节数也一致。
最后一个要注意的问题是VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃
1. 调用DLL的优越性 动态链接库(DLL)作为Windows操作系统的基础,具有优越的应用性能: DLL扩展了应用程序的特性。
由于DLL能够动态地装入进程的地址空间,因此应用程序能够在运行时确定需要执行什么操作,然后装入相应的代码,以便根据需要执行这些操作。
DLL可以用多种语言进行编写。
例如用VB来编写应用程序的界面,而用C++来编写诸如算法、通讯之类的底层操作。
DLL简化了软件项目的管理。
如果在软件开发过程中不同的工作小组在不同的模块上工作,那么这个项目管理起来比较容易。
DLL有助于节省内存。
如果两个或多个应用程序使用同一个DLL,那么该DLL的页面只要放入RAM一次,所有的应用程序都可以共享它的各个页面。
DLL有助于资源的共享。
DLL可以包含对话框模板、字符串、图标和位图等资源,多个应用程序能够使用DLL来共享这些资源。
DLL有助于应用程序的本地化。
例如,只包含代码而不包含用户界面组件的应用程序可以加载包含本地化用户界面组件的DLL 。
DLL有助于解决平台差异。
不同版本的Windows配有不同的函数,开发人员常常想要调用新的函数。
但是,如果源代码包含了对一个新函数的调用,而应用程序将要在不能提供该函数的Windows版本上运行,那么操作系统的加载程序将拒绝运行该进程。
如果将这些新函数保存在DLL中,那么应用程序就能够将它们加载到Windows的老版本上,就可以成功地调用该函数。
2.找到DLL的入口点 初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。
这主要是由以下疏漏造成的。
首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参数类型、参数个数等方面必须完全相同,尤其要注意大小写的问题。
其次,在DLL的.def文件中必须加上入口函数。
最后,在函数定义前必须加上extern "c",_stdcall关键字。
具体格式可参看应用实例。
3.数组参数在DLL中的传递 由于DLL经常用来进行一些底层的运算操作,因此应用程序常需要传递大量的数据给DLL。
在C++中,指针是进行数组操作的最佳选择,但VB中没有指针的概念。
这通常可用两种方法来解决。
其一,在VB中声明DLL时,用byref来代替byval,即可将数组指针传递给DLL。
另外,将数组声明为变体型(variant),即可直接将数组传递给DLL。
4.应用实例 以下通过一具体实例来说明在VB中调用VC环境下创建的DLL的过程。
创建一用于信号处理的DLL,"SigPro.dll",其中有一个用于富氏计算的函数"Fourier"。
VC中的声明:在"SigPro.h"中加入以下代码,extern "C"{double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos);}在"SigPro.cpp"中加入以下代码,extern "C"double EXPORT _stdcall Fourier(long int *Sample,int NumSam,int OvertoneOrder,bool SinOrCos){int i;double result=0.0;if(SinOrCos==true){for(i=0;i 如,何在,中,调用,编,写的,DLL,一般来说,和,
中国骑兵的战斗能力如何?曾被外媒评为世界上“最可怕”的军队,为什么又被取消
相信大家都记得其中这样一段,连连长孙德胜,带着仅剩的十几名骑兵,数次向日本骑兵联队发起进攻,最终骑兵连全体阵亡。
他们代表的不仅仅是中国军人,更是代表着中国军魂。
不过大家可能不知道,其实历史上中国的骑兵曾被外媒评为是世界上“最可怕”的军队。
但为何这支队伍被彻底取消了呢? 其实骑兵并不是抗日时期才有的产物,无论是中国古代亦或是西方国家的古代,骑兵这个词就一直存在着,他们骑在战马上面,凭借着高超的马术与刀术,对敌人发起进攻。
而后来随着热兵器的出现,骑兵则越来越少了,但是依然有着骑兵的存在。
而随着我国“骡马化”的淘汰,骑兵部队便被彻底取消了,仅仅只是象征性的保留下了几只骑兵连队。
要说起中国为什么能够成为外媒严重“最可怕”的军队,其实离不开一个人,他就是组建了新四军第四师骑兵团的彭雪枫,而当时考虑到中国军人与欧美的不同,所以他放弃了苏军的马刀,而设计了一种刀身修长且轻薄的钢刀,将之称为“雪枫刀”。
而也正是雪枫刀的存在,使得中国军人使起来非常顺手,再加上骑兵自身的优势本就比陆军要强,毕竟有了战马的加持,骑兵无论是在行军速度上面还是在机动性上面,都要比步兵强上很多,所以在当时骑兵也是战功赫赫。
纵然因为当年的大裁军,将骑兵的兵种彻底抹去,但是骑兵永远都存在我们的心中,永远无法抹去。
随机文章从月亮上看地球好恐怖,能够弄瞎你的双眼(地球亮闪闪)揭秘小孩怎么投胎选父母的,你家宝宝是来讨债的还是报恩的呢世上有神仙的十大证据有哪些,真实巨蟒渡劫/修真成仙/神仙下凡事件黑洞里面是另一个宇宙,宇宙中每个黑洞都是平行宇宙被黑洞吸进去的东西去哪了,黑洞的出口通向哪里/从白洞吐出
董奉对后世有着什么影响?他的医术到底如何样
吴先主时,有一个年轻人任候官县的长吏,见董奉当时有四十来岁,他不知道董奉有道术。
后来这位长吏罢官走了,五十多年后又担任了另外的职务,经过候官县,见当年的同事都老了,而董奉的容貌似和五十年前一样。
他就问董奉:“你是不是得了道呢?我当年看见你是这样,现在我已白发苍苍,可你却比当年还年轻,这是怎么回事?”董奉含糊地应了一句:“这是偶然的事罢了。
” 交州刺史士燮得了暴病死去,已经停尸三天,正好董奉在交州,听说后就前去看望,把三个药丸放在死者嘴里,又给灌了些水,让人把死者的头捧起来摇动着让药丸溶化,不一会儿,士燮的手脚就像能动,脸上有了活人的颜色,半日就能坐起来,四天后就能说话了。
士燮说:“我刚死的时候就像在梦中,看见来了十几个穿黑衣的人把我抓上车去,进了一个大红门把我塞进了监狱。
监狱里都是小单间,一间里只能住一个人。
他们把我塞进一个小单间里,用土把门封上,就看不见一点光亮了。
我忽然听见门外有人说太乙真人派人来召我,又听见有人挖开门上封的泥土,半天才把我弄出来。
这时我看见有一辆支着红伞盖的马车,车上坐着三个人,有一个人拿着符节,招呼我上车。
车把我送到家门口我醒了,就复活了。
”士燮向董奉跪拜说:“承蒙您救死复生的大恩,我该怎样报效呢?”于是他就给董奉在院里盖了一座楼侍奉他。
董奉不吃别的东西,只吃干肉和枣,还能喝一点酒,士燮就一天三次供奉肉、枣和酒。
董奉每次进食都像鸟一样腾空来到座位,吃完了就飞走,别人常常无所察觉。
这样过了一年多,董奉辞别离去。
士燮哭着挽留也留不住,就问董奉要去什么地方,要不要租买一条大船。
董奉说:“我不要船,只要一具棺木就行了。
”杜燮就准备了一具棺木。
第二天中午董奉就死了,士燮把他装殓后埋葬了。
七天后,有个从容昌来的人捎话给士燮,说董奉感谢他,望他多多珍重。
士燮知道董奉未死,就到墓地打开棺材,见里面只有一块绸子。
绸子的一面画着个人形,另一面用朱砂画了道符。
后来董奉回到豫章庐山下住,有一个人得了热病,快死了,用车拉着来见董奉,叩头哀求董奉救命。
董奉让病人坐在一间屋子里,用五层布单子蒙上他,让他别动。
病人说起初觉得一个什么动物舔他身子的每一个地方,使他疼痛难忍。
这个东西的舌头好像有一尺多长,喘气像牛一样粗,不知是个什么玩艺儿。
过了很久那东西走了。
董奉就把病人身上的布单揭下来给他洗澡,然后就让他回家。
董奉告诉病人不久就会好,注意不要受风。
十几天后,病人身上的皮全脱掉了,全身通红十分疼痛,只有洗澡才能止痛。
二十天后,病人身上长出新皮,病也好了,皮肤十分光滑,像凝结后的油脂。
后来当地忽然大旱,县令丁士彦和官员们议论说:“听说董奉有道术,也许能降雨。
”就亲自带了礼物拜见董奉,说了旱情。
董奉说:“下雨还不容易吗?”说着抬头看看自己的屋子后说:“贫道的屋露天了,我担心真来了雨我可怎么办。
”县令立刻明白了,就说:“先生只要能行雨,我保证马上给你盖新房子。
”第二天,县令自己带着官员民工一百多人,运来了竹子木材,屋架很快立起来了。
但和泥没有水,打算到几里外去运水。
董奉说:“不必了,今晚将有大雨。
”他们就没去运水。
到了晚上果然下起了大雨,水把高处低处的田地都灌平了,老百高兴坏了。
董奉住在山里不种田,天天给人治病也不取分文。
得重病经他治好的,就让患者栽五棵杏树,病轻的治好后栽一棵,这样过了几年就栽了十万多株杏树,成了一大片杏林。
他就让山中的鸟兽都在杏林中嬉戏,树下不生杂草,像是专门把草锄尽了一样。
杏子熟后,他就在杏林里用草盖了一间仓房,并告诉人们,想要买杏的不用告诉他,只要拿一罐粮食倒进仓房,就可以装一罐杏子走。
曾经有个人拿了很少的粮食,却装了很多的杏,这时杏林里的一群老虎突然吼叫着追了出来,那人听得捧着装杏的罐子急忙往回跑,由于惊惶逃命,一路上罐里的杏子掉出去不少。
到家一看,剩下的杏正好和送去的粮食一样多。
有时有人来偷杏,老虎就一直追到偷杏人的家中把他咬死,死者家的人知道是因为偷了杏,就赶快把杏拿来还给董奉,并磕头认罪,董奉就让死者复活。
董奉每年把卖杏得来的粮食全部救济了贫困的人和在外赶路缺少路费的人,一年能散发出去两万斛粮食。
县令有个女儿被鬼缠住,医治无效,就投奔董奉求治,并说如果治好了就把女儿许给董奉为妻。
董奉答应了,就施起法术,召来了一条几丈长的白鳄鱼,鳄鱼自己在地上一直爬到县令家门口,董奉就让随从的人把鳄鱼杀死,县令女儿的病就好了。
董奉就娶了县令的女儿,但很久没有儿女。
董奉经常外出,妻子一人在家很孤单,就收养了一个女孩。
女孩长到十几岁后,有一天董奉腾空升入云中成仙而去了。
他的妻子和养女仍然住在家里,靠卖杏维持生活,有敢欺骗她们母女的,老虎仍然追咬。
董奉在人间三百多年才仙去,容貌仍像三十岁的人。
随机文章陆地霸主猛犸象灭绝之谜,真相竟然是骨质疏松(缺钙)秦始皇地宫被盗过吗,秦始皇地宫藏万吨水银无人敢挖(剧毒)学心理学可以找什么工作,心理学工作盘点(企业猎头/公务员)挪威NSM精确制导导弹,曾受到F35青睐(制导方式奇特)宇宙到底有没有尽头,如果有那么宇宙之外会是什么