如何在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,一般来说,和,
太阳连续爆发两次“耀斑”大爆炸?其中一
太阳连续爆发两次“耀斑”大爆炸,其中一次“闪焰”高达X9.3级 太阳打喷嚏!闪焰连4天狂爆发。
太阳闪焰触发地磁暴,中低纬地区将现极光。
太阳爆发12年来最强闪焰。
大型太阳黑子出没!(图/台湾中央气象局) 据ETtoday:美国国家太空总署(NASA)证实,太阳在6日晚连续爆发两次被称为「闪焰」(Solar flare,即太阳耀斑)的大爆炸,其中一次高达X9.3级,打破了12年来的观测纪录,并伴随着太阳质子事件和日冕物质抛射(CME)产生。
专家表示,这2起爆炸所产生的电磁波(日冕物质抛射),预计在8日晚上或9日影响地球,严重时可能导致无线电传输,包括卫星定位系统(GPS)的暂时性故障,和大规模的停电事件。
NASA在6日侦测到两次太阳闪焰,这两起爆炸时间,分别是美东时间6日清晨5时10分与上午8时3分(台湾时间6日下午5时10分与晚间8时3分)。
第一次为X2.2级,而第2次则高达X9.3级,是12年来最大规模。
据维基百科的资料,历史上最强大的闪焰出现在1859年9月,在当时用肉眼就可以直接观察得到,许多电报机也突然起火燃烧。
中国中科院国家空间科学中心表示,本次太阳闪焰爆发,是由一个代号为AR2673的太阳黑子群所引发。
该黑子群从3日以来,在5天时间内已经爆发了10多次太阳闪焰,其中,在4日爆发的太阳闪焰还伴随着日冕物质抛射,并直接导致了中等太阳质子事件。
有专家表示,本次太阳闪焰爆发伴随的日冕物质抛射(电磁波)可能于明晚或后天到达地球,将会引起地球磁层、电离层和高层大气强烈的扰动,这种巨大的空间环境扰动将可能影响到卫星以及太空船的性能和安全。
太阳闪焰会强烈的影响地球附近的太空天气,产生携带高能量的微粒的太阳风,菜叶说说,就是所谓的太阳质子事件,这些粒子会影响地球磁场,2016年曾有29只抹香鲸在荷兰、英国的外海搁浅死亡,科学家就曾怀疑是闪焰造成磁场出现短期改变,使得抹香鲸游往错误方向。
据了解,日冕物质抛射是指太阳表面释放出大量的物质与电磁辐射进入太空,如果抛射方向朝向地球,可能会扰乱无线电传输和对人造卫星与输电线路造成损害,导致大规模的停电事件。
相关报道:太阳打喷嚏!「闪焰」狂爆触发地磁暴 中低纬将现极光 菜叶说说 据ETtoday:最强太阳闪焰喷发!台北天文馆发布观测讯息,指大型黑子出没,6日晚间爆发强烈闪焰,等级高达X9.3,是12年以来威力最强,导致欧洲等中高纬度地区短波无线电中断。
而这次闪焰也触发了一个正对地球而来的日冕物质喷发,预估8日抵达地球,可能引起地磁暴,引响发电设施、卫星等,甚至会出现美丽极光景象! 美国国家航空暨太空总署(NASA)公布照片,指太阳从4日开始已经喷发10多次闪焰,7日喷发2次高强度闪焰,第一次在美东时间上午6时15分,第2次则是上午10时36芬,更是达到巅峰强度;其中6日的2次闪焰,有害辐射虽无法通过大气层对人类造成影响,但只要足够强大,将可能干扰GPS通讯及信号传播。
台北天文馆7日也发布观测资讯,AR 2673黑子群在台北时间6日晚间8时2分爆发强烈闪焰,等级高达X9.3,是自2005年9月7日以来威力最强的太阳闪焰,爆发时所发出的X射线和紫外射线冲击到地球高层大气后,造成欧洲、非洲和大西洋(600558) 地区发生短波无线电讯号中断的现象。
#p#分页标题#e# 天文馆进一步解释,最新的SOHO太阳观测卫星(Solar and Heliospheric Observatory)C3日冕仪观测影像证实这次闪焰爆发也触发了一个正对地球而来的日冕物质喷发(coronal mass ejection,CME)。
大量电浆云朝地球奔驰而来,估计将在8日抵达,可能引起G2-G3等级的地磁暴,发电设施、卫星控制中心和航空公司需密切注意发展,而极光观测者在本周可能等到美丽的极光景象。
研究显示,1859年9月1日至2日的卡林顿事件(Carrington Event),不仅强到在白光波段的太阳投影影像都可记录到黑子群周边变亮的现象,同时在全球许多地方都可见极光,可见区域甚至延伸到低磁纬地区,包括古巴,非常罕见;强烈爆发同时引起欧洲和北美洲的电报系统失败,甚至引起电报机起火、电报塔的架子也发出火花,使欧美地区的通讯中断了数天之久。
事实上,太阳闪焰是太阳表面最剧烈的一种爆发现象,会在短时间内释放大量能量,并向外发射大量电磁辐射,就像是太阳打了一个「喷嚏」。
若喷嚏正对地球,大量带电粒子轰击地球,可能会对地球产生影响。
这次发生的X级爆发能量异常强大,所放出的辐射和粒子冲向地球后,和地球磁场和电离层相互作用,可能干扰无线电通讯、GPS导航,除了两极之外的更低纬度地区可能出现极光,甚至对太空人和卫星安全构成威胁。
中国有锁龙井吗?
比较出名的有《故宫闹鬼事件》《锁龙井灵异事件》《北顶娘娘庙事件》《朝内81号凶宅》等等关于北新桥锁龙井灵异事件,有很多传说故事。
北新桥位于,东直门内大街西端,交道口东街东端,东四北大街北端,雍和宫大街南端汇合的十字路口,属于东城区,北新桥街道办事处管辖。
在北京民间,自古便流传着一个传说,传闻在北新桥的位置,有一口井,井的深处还有一头被铁链锁着的孽龙,后世,将这口井称为锁龙井。
传说井下还有一个海眼,海眼直通渤海,谁要是动了泉眼,整个北京城就要被大水淹了。
在后来,陈市建设,由于这口井碍事,工人于是打算将井填了,不过打开井盖后,却看到里头有一条手臂粗的铁链,井深不见底,当时的人很迷信,都说不要动,但是也有好事胆大的,非要看看铁链下到底有什么,于是开始向上拉铁链,铁链越拉越多,却没有到头的意思,同时听见井底发出隆隆的沉闷响声,工人们害怕了,将铁链又放了回去,最后用大石条盖上。
此外,据说,在日军侵略期间,也曾发生过类似的事情,相传,在1937年,日军在北平西南卢沟桥附近演习时,借口一名士兵失踪,入侵占领了北平,而后在全城搜索时,在北京北新桥的位置发现了一口奇怪的井,便以为井里藏有中国士兵。
所以强迫老百姓拉铁链,老百姓拉了三天三夜,也没有尽头,拉出来的铁链摆的满大街都是,日军不信邪,还让继续往上拉,这时井里突然往上反黑水,同时还有类似牛叫的声音,吓的日军也不敢在往上拉了,把铁链又顺了回去。
而现在之所以找不到锁龙井,是应为城市建设需要,在原址上盖起了商店,起地基的时候把那口井给绕过去了,井的正上方,有一间小屋子,常年锁着,类似的传闻在民间和野史中广泛流传。
莫非真的存在着这么一口神秘的古井,井里头又锁着一条活龙,可是反过来想,又有些不太对劲,既然锁龙井被传得那么邪乎,为什么没有专家前往一探究竟,为什么在各种传说的背后,铁链都只是拉到一半又放回去呢?当神秘与疑惑相杂糅,便如同夜幕下的迷雾,让人真假难辨。
据民间故事(姚广孝禽龙记)记载,北新桥锁龙井最初是起源于明朝,相传,当年朱棣夺位称帝后,便准备将都城由南京迁往北平,于是先派遣姚广孝负责修缮北京城,姚广孝入京后,意外发现了城内有九处海眼,内部泉眼直通大海,其中两处最大,一口在京西五泉山下,被白塔镇着,还有一口在北新桥,由于没有镇压之物,内部常有孽龙出来作怪,于是姚广孝连同宋朝岳将军的英灵制服孽龙,将孽龙锁入井中,,井上还建了一座岳飞庙,用于镇压孽龙,这就是北新桥锁龙井的由来。
锁龙井也称锁蛟井,是中国神话故事里的一个实物性内容,反映人们数千年的治水理想,是中华文化里一个重要现象。
最早的神话传说是禹王锁蛟龙,相关的有禹州的禹王锁蛟井、济南市舜井、淮阴龟山支祁井、重庆市巫山县锁龙村的锁龙柱等文化传说地。
另外,北京市的北新桥、潭柘寺及其它省份也有锁龙井(锁蛟井)传说。
北京的北新桥锁龙井据说刘伯温和姚广孝两个人建立了北京城,完工之后发现有几口海眼,一直通向大海。
其中两口比较大的,一个在京西玉泉山镇在一个大庙下面,另一个在北海被白塔镇着。
还有较大的在东直门的北新桥。
当时为防止水患,抓了一条龙锁在了海眼里,刘伯温、姚广孝把孽龙锁在北京北新桥的海眼里,海眼上修一个深深的井筒子,拴上长长的大锁链,井上再修一座三间大殿的庙宇。
庙里供什么神像呢?姚广孝想起帮他拿住龙公的不是岳元帅吗,就供岳飞吧。
龙公在被锁进海眼之前的时候问道:姚军师,难道要关我一千年、一万年吗?什么时候我才能出来呀?姚广孝说:等这座桥旧了,修起桥翅儿来,就是你的出头之日。
打这儿起,这里就叫了北新桥,北新桥从来也没有过什么桥翅儿。
姚广孝又把龙子锁在崇文门镶桥下的海眼里,龙子也问:姚军师,难道关我一千年、一万年吗?我什么时候才能出来呀?姚广孝说:只要你听见开城门的时候打碘,就可以出来了。
打这儿起,崇文门开城、关城不再打碘,一律改为打钟。
老年人都说:北京城九门八碘一口钟啊。
人们看到北新桥北边还有一座镇海寺,就更信这个传说了。
当年日本人占据了北京城后,让当地百姓拉过井里的铁链,铁链子拉上来铺了一地也不见头,日本人不死心让继续拉,老百姓继续拉,拉着拉着井里开始往上反黑水并且还有怪叫声,日本人这回吓着了,让老百姓把铁链子又放了回去。
第二次是红卫兵破四旧。
也把大铁链子往上拉,结果根日本人一样。
也全吓傻了,赶紧恢复了原貌。
最近一次跟北新桥海眼有关的事是2004年修地铁5号线,修建期间打开了传说中的锁龙井遇事故,后被迫绕道而行 。
此事新闻里还播了,说是为了不破坏北新桥的一口古井,地铁绕了多少多少公里。
现在的科学家都不敢去碰它。