大家都是用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属性好像也没有起到作用吧?恕在下愚钝,还望各位高手见笑!

解决方案 »

  1.   

    错误429是:
    运行时错误或无法创建ACTIVEX对象用错误捕捉来看控件ocx1(名称自己看着修改)是否已经注册。如果出现错误,就直接调用Shell来进行注册至于DoEvents不清楚为何要用了,请楼下的解答哦!学习
      

  2.   

    Shell "RegSvr32 /S OCX1.ocx"
    DoEvents  '移交控制权
    -------------------------------------
    因为使用了shell函数,而Shell 函数是以异步方式来执行其它程序的。也就是说,用 Shell 启动的程序可能还没有完成执行过程,就已经执行到 Shell 函数之后的语句。
    DoEvents 会将控制权传给操作系统.ocx1.Tag = 1应该是为了识别多个控件而使用的标签吧
      

  3.   

    ocx1.Tag = 1是一个标志,可以做很多很多的事情,主要还是区别一个其他的东西,
      

  4.   

    哦。还好,不算复杂,看起挺简单,不过倒的确实用!!问题是程序中引用了大量的库,控件,
    难道在启动的时候全部ocx都赋值tag一次,注册一次?岂不麻烦?
    dll的话,也需要拷贝到system目录下?还是怎么处理呢?我想,在程序正式启动前,先专门用个程序来检测所需的库,控件等是否都存在,否则进行注册。。
      

  5.   

    晕。如果大量使用OCX的话,当然要把所有的控件,dll放在一个目录下,然后建一个批处理、
    ,再用程序调用。这样会好很多。
    批出理可以这样写:for %%1 in (*.ocx,*.dll) do regsvr32 %%1 -s
      

  6.   

    那岂不是永远都不会调用RegVoice函数进行控件(组件)注册吗?當程序運行有錯且Err.Number = 429 時就會調用RegVoice函數本人認為此方法並不是很適用,如果使用的控件過多話,這樣是一筆不小的開支
      

  7.   

    Re: //本人認為此方法並不是很適用,如果使用的控件過多話,這樣是一筆不小的開支我想可能楼上的没有理解楼主和叶帆的意思吧。这段注册过程仅出现在系统被重装,但组件文件却仍然存在时的一种特殊情形下。例如:应用程序与所有用到的组件文件均安装在d:盘,系统在C:或其他非D:盘中。程序首次安装时注册了所有组件,应用程序正常运行,但系统重装后,程序中那些组件的注册信息已丢失,此时程序不能运行。使用上述代码,程序可以在此时自动注册组件,注册成功后继续运行。所以并不是程序每次运行时都去注册的。可以将这个过程理解为一次修复过程。因此,总体思路比较理想!
      

  8.   

    我是楼主,感谢大家的帮助。ocx1.Tag = 1应该是为了识别多个控件而使用的标签吧?????????
    为了误别?