大家都是用VB的,想必时常对打包头痛。尤其是当使用了第三方控件后更加让人郁闷。虽然有人可以借助专用打包软件进行控件注册。这样在软件安装后就可以能够正常运行。但做一个程序,我们都希望将其理想化。如果这个程序在安装后,系统被重装了后呢?于是这些控件的注册信息就被“洗”了,此时用户岂不是又要重装?本人就这个问题特向许多高手请教。然而答案都不尽如人意。但幸运的是,本人这两天遇到一个叫“叶帆”的高手的指点(在些特别表示感谢),无奈本人能力有限。对高手给予的技术支持却不能透彻理解,甚为苦恼。下面先将代码贴出:'--------------------------------代码开始
Private Sub Form_Load()
On Error GoTo ToExit '打开错误陷阱
ocx1.Tag = 1 'ocx1为控件名
Exit Sub
'----------------
ToExit:
If Err.Number = 429 Then
Call RegVoice '调用自动注册组件的函数
End If
'Call RegVoice '调用自动注册组件的函数
End Sub
Private Sub RegVoice() '自动注册组件
On Error GoTo ToExit '打开错误陷阱Shell "RegSvr32 /S OCX1.ocx"
DoEvents '移交控制权
ocx1.Tag = 1
Exit SubToExit:
MsgBox "组件无法注册,找不到OCX1.ocx!", vbCritical, "测试"End Sub
'-----------------------------------代码结束
从高手的指点中可以看出,最好的注册方法还是在程序本身。于是便有了下列问题:
OCX1.tag = 1是在程序启动时就执行,然后就Exit Sub 退出form_load事件了,那岂不是永远都不会调用RegVoice函数进行控件(组件)注册吗?顺便请问Err.Number = 429中的429是代表哪一种错误?还有RegVoice函数中的移交控制权DoEvents有什么作用呢?tag属性好像也没有起到作用吧?恕在下愚钝,还望各位高手见笑!
Private Sub Form_Load()
On Error GoTo ToExit '打开错误陷阱
ocx1.Tag = 1 'ocx1为控件名
Exit Sub
'----------------
ToExit:
If Err.Number = 429 Then
Call RegVoice '调用自动注册组件的函数
End If
'Call RegVoice '调用自动注册组件的函数
End Sub
Private Sub RegVoice() '自动注册组件
On Error GoTo ToExit '打开错误陷阱Shell "RegSvr32 /S OCX1.ocx"
DoEvents '移交控制权
ocx1.Tag = 1
Exit SubToExit:
MsgBox "组件无法注册,找不到OCX1.ocx!", vbCritical, "测试"End Sub
'-----------------------------------代码结束
从高手的指点中可以看出,最好的注册方法还是在程序本身。于是便有了下列问题:
OCX1.tag = 1是在程序启动时就执行,然后就Exit Sub 退出form_load事件了,那岂不是永远都不会调用RegVoice函数进行控件(组件)注册吗?顺便请问Err.Number = 429中的429是代表哪一种错误?还有RegVoice函数中的移交控制权DoEvents有什么作用呢?tag属性好像也没有起到作用吧?恕在下愚钝,还望各位高手见笑!
运行时错误或无法创建ACTIVEX对象用错误捕捉来看控件ocx1(名称自己看着修改)是否已经注册。如果出现错误,就直接调用Shell来进行注册至于DoEvents不清楚为何要用了,请楼下的解答哦!学习
DoEvents '移交控制权
-------------------------------------
因为使用了shell函数,而Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
DoEvents 会将控制权传给操作系统.ocx1.Tag = 1应该是为了识别多个控件而使用的标签吧
难道在启动的时候全部ocx都赋值tag一次,注册一次?岂不麻烦?
dll的话,也需要拷贝到system目录下?还是怎么处理呢?我想,在程序正式启动前,先专门用个程序来检测所需的库,控件等是否都存在,否则进行注册。。
,再用程序调用。这样会好很多。
批出理可以这样写:for %%1 in (*.ocx,*.dll) do regsvr32 %%1 -s
为了误别?