第一次接触到这个工具的童鞋,可以去看一下我以前的这个贴子了解“历史”:
【小工具】VB6.0制作“标准DLL”----彻底摆脱ActiveX DLL的影子
这个软件的“安装”和使用方法,可以说跟原来一样,具体细节就不再在这儿说了,如果不清楚,去看之前的贴
子就行。本人很反感网上“相同的内容满天飞”这状况!因些也不会在这儿重复那些内容。(己所不欲,勿施于人)
这次的软件版本为Ver1.3了。软件的界面、使用方法基本上没有变化,主要的是修正了几个BUG,以及改变了左边
的树形列表控件的操作方式,增加了DLL函数基址地址的还原功能。BUG共3个:一个是导出函数列表管理问题,一个是
控件事件响应问题,还有一个是基址合法性判断问题。
第一个BUG是逻辑错误,不过如果你不是象“做项目开发”那样来使用这个工具,可以说“根本表现不出有BUG”
(我都是在后来做“大项目”测试,才发现的,呵呵……),出现问题的时候,是“一个项目在再次编译DLL文件”
时,会看到保存的导出函数列表,跟你之前选择的不完全一致,你得重新按你的需求,对导出函数列表进行增减;当
然DLL文件不会有错,窗口右边列表中有哪些函数,编译后必然就是那些导出函数。第二个“事件响应”的问题,还真
不能怪我,根源还是M$造成的!(汗……),这个问题我最初在开发软件时就已经考虑到这点的,就在IDE中针对这
项操作(正常使用基本不会出现这种操作,是一种“故意乱搞”的操作)进行了测试,没有错误出现,但编译成的
.exe就会出错。后来经我验证发现:在IDE中不会出错、不启用XP-Style风格外观也不会出错;编译成.exe并且启用了
XP-Style风格外观,如果不采取“预防措施”就有可能引起运行错误(没做异常捕获或其它必要的处理,就有可能造
成程序出错崩溃)。我这儿解决这个也超简单,一个If语句就搞定。第三个BUG,就基本不算什么了,我的本意是:如
果你把基址设置得很大,“确定”时就会提示你基址太大,你可以确认使用这个基址编译、或重新设置基址;但大到一
定的值,是不允许按这个基址进行DLL编译的!这个BUG就是判断逻辑上的疏忽,没有做好“禁止操作”这步。
基址还原的功能,就是在第一次编译DLL时,会把你指定的新基址地址(或者默认基址地址)写入到数据库中;当
再次编译时,你会在窗口中看到它仍然是你先指定(或默认)的基址地址。之前的版本,虽然也把指定的基址地址写
入了数据库,但再次编译时,如果管理窗口显示出来,窗口内的基址值始终是默认值12000000;不过若是你在点“确
定”按钮前去掉了“提醒选择导出函数列表”的钩选,那再次编译时(如果工程没有重大改变)就不会出现导出函数
管理窗口,这时会按你指定的基址地址进行编译,汗一个…… 。
最后再说一下窗口左边树形列表控件的操作方法。之前的版本,在树形列表控中只能执行“添加导出函数”的操
作,并且单个函数的添加是“连续两次单击”,这个速度还真不好掌握,因为我设定的时限是800ms,而操作系统默认
的“双击”时限大概是500ms吧(我自己的电脑一般都改成了150ms,相对来说要较快点击才能完成双击),这样对大
多数人的“时间允差”就只有0.3秒了:如果快了点,则会是“双击”事件,消息被控件“吃了”,应用程序不会得到
消息通知;如果太慢了,则不能将选定的函数添加到导出列表。现在更新后的操作是:第一次单击函数节点,则选定
这个节点;再在选定的节点上单击,就可以实现“添加”和“移除”导出函数的操作。
针对之前有部分网友提到的“这个工具有问题”,以及一些不太明白DLL代码编写方法的情况,我这段时间写了一
些比较有代表性的DLL源码样例,稍候会上传到CSDN资源中,有兴趣的可以下载参考。
另外再说一个“运行环境”的问题:我的这个工具软件,仅是限制用于 VB6.0 的开发环境,其它版本的VB开发环
境,因为我没有安装包,不能够进行测试,无法保证编译和链接参数的兼容性,因此在软件中进行了检测和限制。另
外需要说明的是:我这个软件,无论是VB6.0的精减版,还是企业版,都能正常运行!操作系统方面,只要是Windows
XP或更高的版本,就能运行(实际可能在Win2K也能运行)。有网友在资源下载的评论中说,Win7-64位系统下不能运
行,我想应该是没正确使用的原因。我的这个工具软件,最初是在WinXP+VB6精减版下开发、调试、编译成.exe,然后
直接用在Win7旗舰版(64位)+VB6企业版中,运行无任何异常。然后在Win7-64位系统的VB6企业版中重新编译,再把
.exe用到WinXP+VB6精减版中,也是完全正常的。我把上传到资源中的1.2版那个,用在Win7专业版(32位)+VB6企业
版、WinXP+VB6企业版中,也是照样正常。这个软件在我发现BUG之后,虽然进行过几次修改,但核心没有变化,应该
说对运动环境的需求没有差别。
还有的网友说做出来的DLL函数,不能通过RunDLL32来调用,会出错崩溃。其实这是一个方法问题,只要按照
“示例⑴”中说的那种编写方法,编译后DLL导出函数就能够供RunDLL32调用。
在这儿,我把“DLL示例”代码的说明文件内容贴出来一下(没这个内容,可能吸引力就大打折扣了,呵呵):
㈠ VB6.0制作DLL初级篇
示例⑴:最基本的DLL示例代码。包含几个无参数过程、带参数
过程、带参数的函数。
这个示例中,分别写了在VB6.0、VC6.0在应用的实例。主要目的
就是说明,用VB6.0完全可以写出在C++等其它语言环境中也能够正常
运行的DLL代码。不过呢,要做到这步,付出的代价还是很大:在这
个DLL源码中,需要调用的Win32 API,只能做成类型库来引用,不能
通过Declare来调用了;另外就是VB6中的很多内置函数也无法使用。
否则,在其它环境中调用,就会出错,造成程序崩溃。
当然如果这个DLL只是提供给VB6.0用,那就没有这么多麻烦了,
DLL源码的写法就跟平常编程没有区别。从目前的环境来说,用VB6.0
编写DLL来给别的开发环境使用的可能性几乎为零,再加上我对C++也
不熟悉,因此后面的DLL示例,仅是“for VB6.0”的写法了,不再写
VC6.0的应用实例。
㈡ VB6.0制作DLL进阶篇
示例⑵:在前面的示例⑴中,也应用到了“参数传递”,但这种
仅仅是普通的“数值类型”的参数。这种参数,是最基本、最简单的
数据类型。并且在各种计算机语言的环境中,都不存在差异(最多就
是带符号、无符号的差别而已),所以不用作任何处理,都能正常传
递的。而在这个例子中,主要目的是演示字符串参数的传递、在VB6
中如何正确处理“从API传入的字符串”。
在VB6.0中进行API声明时,字符串参数传递方式有ByVal及ByRef
两种;而在DLL的源码编写时,函数中对应的参数类型可以是String
类型,也可以是Long类型!同样,参数传递方式也有ByVal及ByRef两
种。总的来说,“需求和实现方法(编程习惯)”决定了DLL代码中
函数参数的类型及传递方式;而DLL代码如何编写,则决定了在VB6中
使用API时,参数要如何声明。如果API声明跟源码需求不一致,基本
上就不能正确运行,当然具体使用时在代码中强制指定为正确匹配的
传递方式除外。具体细节在示例代码中说明,在这里不再赘述。
㈢ VB6.0制作DLL高级篇
示例⑶:这个是按“正常模式”编写的DLL代码,里面就涉及到
窗口显示、类对象创建等方面的东西。可以看到:显示消息、操作已
经在系统中注册了的类,不会有问题;但要显示自己的VB窗口、创建
自己的类对象(类的源代码在DLL中),立即造成程序崩溃!“自己
的VB窗口”就不说了,这个在VB6中还真不好去“独立封装”,但是
“自己的类”,如果把这个类事先编译成ActiveX DLL、然后把这个
DLL在系统中注册(这里指的是用在别的计算机上,“本机”在编译
生成ActiveX DLL文件后,VB6已经立即给你注册到系统中了),然后
在你的“标准DLL”工程中引用它,仍然是能够正常使用的!!!
关于这方面的“问题”,之前发布这个DLL工具之后,就有网友
提出过。也有网友认为,用VB6做“标准DLL”,是“没有办法解决这
个问题的!”事实果真如此吗?这个用不着我说能或不能,我要是直
接说出结论,可能不少人又会怀疑我的论断…………
好吧,事实胜于雄辩,这个是大家都应该承认的吧!!! 这到
底是“能”还是“不能”,请看示例⑷ !!!
示例⑷:在“标准DLL”中显示窗口及“创建自己的类对象”。
要完成这个,就得进行一点小小的“技术处理”了,不过这种源码也
得编译后运行.exe程序。实现的细节,暂时不透露…… ^_^
在这儿顺便说一下,这种“标准DLL”,如果用到了VB运行库的
某些特定功能,就得编译后运行.exe程序,否则就会引起IDE出错崩
溃(造成崩溃的深层原因不清楚)。比如在DLL的函数中用到文件操
作(Open等文件操作语句)、随机数功能(Randomize、Rnd()函数)
等等。当然具体有哪些,我并没有去试验过,因些当你遇到调用DLL
函数出现IDE崩溃、同时你又确定你的DLL代码又没问题时,就试下是
不是要编译后才能正常运行。如果编译后运行.exe还是出错,那极有
可能就是你的代码有问题了(DLL代码或EXE的代码)。