VB封装DLL实例(三)
2017-02-11 17:40
253 查看
正 文:
进入VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,点【浏览】按钮,打开【添加引用】对话框,点选要引用的DLL(测试实例为:ClsFindString.dll),点【打开】—点【确定】,我们完成动态链接库的手动注册及引用。
![](http://www.accessoft.com/userfiles/tanhong/20100602003318.jpg)
(二)手动注册及引用方法不足及问题
手动注册引用优点是不言而喻的,方便简捷,易于操作。但在实际运用中,当我们在其他电脑上发布应用程序,或运行我们测试好的应用程序时,却会出现错误提示,程序无法正常运行。
错误(一):找不到工程或库(见下图)
错误的主要原因:DLL在当前运行的电脑系统中没有注册信息,而且引用不正确。
![](http://www.accessoft.com/userfiles/tanhong/20100602003357.jpg)
错误(二):引用的动态链接库(DLL)丢失(见下图)
进入到VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,我们会看到之前引用的DLL动态链接库丢失。
错误的主要原因:系统无法找到原路径引用DLL。
![](http://www.accessoft.com/userfiles/tanhong/20100602003435.jpg)
错误(三):自动化错误(见下图)
错误的主要原因:我们在发布应用程序的电脑或系统中,虽然重新完成DLL手动注册和引用,但如果DLL路径再次改变,运行程序时就会出现“自动化错误”提示。
![](http://www.accessoft.com/userfiles/tanhong/20100602003517.jpg)
错误(四):ActiveX部件不能创建对象(见下图)
错误的主要原因:应用程序已正常引用DLL动态链接库,但其册注信息丢失或者没有正常注册,就会出现以下问题。
![](http://www.accessoft.com/userfiles/tanhong/20100602003549.jpg)
(三)解决上述错误方法
1、解决错误方法,当然是重新进行DLL的手动注册及引用,具体步骤参下图。但这只是治标不治本的办法,不利于对外发布我们的应用程序,最好的办法还是通过VBA自动完成DLL的注册及引用。
![](http://www.accessoft.com/userfiles/tanhong/20100602003623.jpg)
² DLL注册
是指将DLL的相关信息,如:DLL唯一识标号(GUID),版本号(Version)及路径(Path)信息写入注册表中,以供系统对DLL进行识别调用。
我们通过VB编译生成DLL时,VB一般会自动完成对该DLL的注册,但如果要在其它电脑上运行程序时,我们就必须重新对该DLL进行注册。
² DLL引用
是指将DLL类库对象集成到代码编辑环境中,以便编程时调用类库中的对象、属性及方法。
我们通过手动方式完成DLL的引用时,系统会自动完成对该DLL的注册,所以我们无需另行对DLL进行注册,但如果我们在其它电脑上运行程序时,还会出现我们在之前章节中所述的错误。
(一)DLL自动注册方法
我们可以通过
Regsvr32.exe 来进行DLL注册或反注册,具体的语法及参数:
语法:
Regsvr32 [/u] [/n] [/i[:cmdline]] dllname
说明:其中dllname为DLL文件名,建议在发布时将DLL复制到system文件夹下。
参数:
1.1 示例通过Shell运行Regsvr32程序完成DLL注册
Shell "Regsvr32 /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)
Shell
函数 用以运行Regsver32程序
Regsver32
注册程序
/S
注册程序参数,书写时记得参数前后必须留空
Chr(34)
Chr函数,获指定代码字符,Chr(34)为引号
CurrentProject.Path
DLL当前路径
ClsFindString.dll 演示实例DLL名
1.2 示例通过Shell运行Regsvr32程序反注册
Shell "Regsvr32 /U /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)
我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BAT文件,在打包发布时将该BAT文件一并打包发布,安装时运行该BAT文件,来完成N个DLL的批量注册,在此就不多着笔墨,大家可以参看实例包中的BAT文件实例。
(二)DLL自动引用方法
2.1 通过References对象的AddFromFile方法实现自动引用
Dim ref As Reference
'申明引用类对象
On Error Resume Next
'避免因重复引用造成的错误提示
'实例化引用对象,完成DLL的引用
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References
对象的Remove
方法释放DLL或反引用。
Dim ref As Reference
'申明引用类对象
'实例化反引用对象
Set ref = References("ClsFindString")
'移除引用指定类库
References.Remove ref
说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。
2.2 通过DLL唯一标识号实现自动引用
Dim ref As Reference '申明引用类对象
On Error Resume Next
'避免因重复引用造成的错误提示
'唯一标识号完成注册,需要DLL标识号,主版本号,次版本
Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0)
DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。
2.2.1获取DLL标识号、主版本号、次版本号方法
Dim ref As Reference
'申明引用类对象
'实例化引用类库对象
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
Debug.Print ref.GUID
'获得DLL唯一标识号
Debug.Print ref.Major
'获得主版本号
Debug.Print ref.Minor
'获得次版本号
2.3通过CreateObject方法实现自动引用
Dim DllFindStr As Object
'申明对象
'实例化对象为创建的DLL类库对象
'ClsFindstring为DLL库名,clsFindStr为DLL类名
Set DllFindStr = CreateObject("ClsFindstring.clsFindStr")
DllFindStr.sFindStr Text2, Me.Text0
'调用DLL类库方法,运行程序
Set DllFindStr = Nothing '释放对象
根据我本人实践经验,CreateObject方法自动引用是最为便捷高效的方法,仅供参考。
关于DLL相关自动注册及引用方法就探讨这里,以上文字仅是本人实践的一点总结,希望对大家有所帮助,如有错漏之处还请大家斧正。本文的Word文稿、DLL源码(含DLL)、mdb演示实例及BAT注册文件实例均在实例包中。
一、手动注册及引用
(一)手动注册及引用方法(参看实例:手动引用.mdb)进入VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,点【浏览】按钮,打开【添加引用】对话框,点选要引用的DLL(测试实例为:ClsFindString.dll),点【打开】—点【确定】,我们完成动态链接库的手动注册及引用。
![](http://www.accessoft.com/userfiles/tanhong/20100602003318.jpg)
(二)手动注册及引用方法不足及问题
手动注册引用优点是不言而喻的,方便简捷,易于操作。但在实际运用中,当我们在其他电脑上发布应用程序,或运行我们测试好的应用程序时,却会出现错误提示,程序无法正常运行。
错误(一):找不到工程或库(见下图)
错误的主要原因:DLL在当前运行的电脑系统中没有注册信息,而且引用不正确。
![](http://www.accessoft.com/userfiles/tanhong/20100602003357.jpg)
错误(二):引用的动态链接库(DLL)丢失(见下图)
进入到VBA编辑窗口,点菜单【工具】—【引用】,打开【引用】对话框,我们会看到之前引用的DLL动态链接库丢失。
错误的主要原因:系统无法找到原路径引用DLL。
![](http://www.accessoft.com/userfiles/tanhong/20100602003435.jpg)
错误(三):自动化错误(见下图)
错误的主要原因:我们在发布应用程序的电脑或系统中,虽然重新完成DLL手动注册和引用,但如果DLL路径再次改变,运行程序时就会出现“自动化错误”提示。
![](http://www.accessoft.com/userfiles/tanhong/20100602003517.jpg)
错误(四):ActiveX部件不能创建对象(见下图)
错误的主要原因:应用程序已正常引用DLL动态链接库,但其册注信息丢失或者没有正常注册,就会出现以下问题。
![](http://www.accessoft.com/userfiles/tanhong/20100602003549.jpg)
(三)解决上述错误方法
1、解决错误方法,当然是重新进行DLL的手动注册及引用,具体步骤参下图。但这只是治标不治本的办法,不利于对外发布我们的应用程序,最好的办法还是通过VBA自动完成DLL的注册及引用。
![](http://www.accessoft.com/userfiles/tanhong/20100602003623.jpg)
二、自动注册及引用方法
在探讨如何实现DLL自动注册及引用之前,我们必须清楚一点,那就是DLL的注册与引用并不是同一事件或行为的两种不同表述,而是两种不同的动作。² DLL注册
是指将DLL的相关信息,如:DLL唯一识标号(GUID),版本号(Version)及路径(Path)信息写入注册表中,以供系统对DLL进行识别调用。
我们通过VB编译生成DLL时,VB一般会自动完成对该DLL的注册,但如果要在其它电脑上运行程序时,我们就必须重新对该DLL进行注册。
² DLL引用
是指将DLL类库对象集成到代码编辑环境中,以便编程时调用类库中的对象、属性及方法。
我们通过手动方式完成DLL的引用时,系统会自动完成对该DLL的注册,所以我们无需另行对DLL进行注册,但如果我们在其它电脑上运行程序时,还会出现我们在之前章节中所述的错误。
(一)DLL自动注册方法
我们可以通过
Regsvr32.exe 来进行DLL注册或反注册,具体的语法及参数:
语法:
Regsvr32 [/u] [/n] [/i[:cmdline]] dllname
说明:其中dllname为DLL文件名,建议在发布时将DLL复制到system文件夹下。
参数:
参数 | 说明 |
/u | 反注册 |
/s | 指定regsvr32安静运行,且不显示任何消息框。 |
/n | 指定不调用DllRegisterServer。此选项必须与/i共同使用。 |
/i:cmdline | 调用DllInstall 将它传递到可选的 [cmdline]。在与/u共同使用时,它调用dll卸载。 |
dllname | 指定要注册的dll文件名。 |
1.1 示例通过Shell运行Regsvr32程序完成DLL注册
Shell "Regsvr32 /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)
Shell
函数 用以运行Regsver32程序
Regsver32
注册程序
/S
注册程序参数,书写时记得参数前后必须留空
Chr(34)
Chr函数,获指定代码字符,Chr(34)为引号
CurrentProject.Path
DLL当前路径
ClsFindString.dll 演示实例DLL名
1.2 示例通过Shell运行Regsvr32程序反注册
Shell "Regsvr32 /U /S " & Chr(34) & CurrentProject.Path & "\ClsFindString.dll" & Chr(34)
我们可以将注册语句放在窗体的加载事件,自动完成DLL的注册,具体可以参看实例。但如果我们有多个DLL需要批量注册时,可以考虑通过软件打包发布工具来完成DLL的注册工作;也可以事先编写BAT文件,在打包发布时将该BAT文件一并打包发布,安装时运行该BAT文件,来完成N个DLL的批量注册,在此就不多着笔墨,大家可以参看实例包中的BAT文件实例。
(二)DLL自动引用方法
2.1 通过References对象的AddFromFile方法实现自动引用
Dim ref As Reference
'申明引用类对象
On Error Resume Next
'避免因重复引用造成的错误提示
'实例化引用对象,完成DLL的引用
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
为了避免因重复引用出现的错误,我们可以如上代码中加入Error语句,我们还可以在应用程序退出时,通过对References
对象的Remove
方法释放DLL或反引用。
Dim ref As Reference
'申明引用类对象
'实例化反引用对象
Set ref = References("ClsFindString")
'移除引用指定类库
References.Remove ref
说明:根据本人实践,我个人倾向于使用Error语句,因为如果应用程序非正常退出,引用对象没有反引用成功,启动时就难免出现重复引用的错误问题。
2.2 通过DLL唯一标识号实现自动引用
Dim ref As Reference '申明引用类对象
On Error Resume Next
'避免因重复引用造成的错误提示
'唯一标识号完成注册,需要DLL标识号,主版本号,次版本
Set ref = References.AddFromGuid("{C5E340E2-C557-4852-AE83-5A0578B6863B}", 1, 0)
DLL的标识号是编译生成时就确定了的,这个标识号就是DLL的终生制身份证号,我们可以通过这个唯一标识号来完成DLL自动引用。但此种方法必须具备两个条件,一是DLL已经成功注册,二是我们知道了该DLL的标识号、主版本号、次版本号。
2.2.1获取DLL标识号、主版本号、次版本号方法
Dim ref As Reference
'申明引用类对象
'实例化引用类库对象
Set ref = References.AddFromFile(CurrentProject.Path & "\ClsFindString.dll")
Debug.Print ref.GUID
'获得DLL唯一标识号
Debug.Print ref.Major
'获得主版本号
Debug.Print ref.Minor
'获得次版本号
2.3通过CreateObject方法实现自动引用
Dim DllFindStr As Object
'申明对象
'实例化对象为创建的DLL类库对象
'ClsFindstring为DLL库名,clsFindStr为DLL类名
Set DllFindStr = CreateObject("ClsFindstring.clsFindStr")
DllFindStr.sFindStr Text2, Me.Text0
'调用DLL类库方法,运行程序
Set DllFindStr = Nothing '释放对象
根据我本人实践经验,CreateObject方法自动引用是最为便捷高效的方法,仅供参考。
关于DLL相关自动注册及引用方法就探讨这里,以上文字仅是本人实践的一点总结,希望对大家有所帮助,如有错漏之处还请大家斧正。本文的Word文稿、DLL源码(含DLL)、mdb演示实例及BAT注册文件实例均在实例包中。
相关文章推荐
- VB封装DLL实例(一)
- ASP 调用dll(VB)及封装dll实例
- VB封装DLL实例(二)
- 使用VB将ASP代码封装到DLL文件完整实例
- 使用VB将ASP代码封装到DLL文件完整实例
- [今天的编程日记, 在vb中使用vc编译的dll实例]
- 用VB 6封装ASP代码, 制作DLL组件
- 用VB生成DLL封装ASP代码,连接数据库。
- vb和vc混合编程实例(ocx和dll) (转载)
- 用VB 6封装ASP代码, 制作DLL组件
- 用VB生成DLL封装ASP代码一个例子:连接access数据库等
- asp调用dll及asp封装dll实例
- VB(EXE)/VC(DLL)混合编程实例
- 用VB生成DLL封装ASP代码一个例子:连接access数据库等
- 在dll中delphi中封装窗体(实例)
- 用VB生成DLL封装ASP代码,连接数据库- -
- 在vb中使用Iphlpapi.dll获取网络信息 第四章 第三节 实例一:网络数据流量图
- 用VB 6封装ASP代码, 制作DLL组件
- VB.NET 如何调用VB.NET 写的DLL类库-实例
- 用VB生成DLL封装ASP代码例子