某些用户在使用 VB 程序的时候会发生 429 错误(ActiveX 部件不能创建对象或返回对该对象的引用)。这一般是因为该程序需要调用某些 ActiveX DLL 或者 ActiveX 控件的时候找不到系统文件的情况下发生的。而且 VB 使用的 ActiveX 技术很容易出现该问题。
对此:MSDN 6.0 中是这样解释的。
ActiveX 部件不能创建对象或返回对该对象的引用(错误 429)
创建对象要求该对象的类已在系统注册表中注册,而且任何相关的动态链接库 (DLL)必须能使用。此错误有以下的原因和解决方法:
1.类没有注册。
例如,系统注册表中没有类的说明,或虽有类说明,但找不到文件,或指定的文件类型错误。
如果可能的话,试着启动对象的应用程序。如果注册信息过期或错误,应用程序应该检查注册表并更正信息。如果启动应用程序没有解决问题,请重新执行应用程序的安装程序。
2.对象需要的 DLL 不能使用,可能因为找不到,或是已损坏。
确保所有相关的 DLL 都可使用。例如,Data Access Object (DAO) 需要支持多平台的 DLL。如果这是造成错误的原因,则要为此对象重新执行安装程序。
3.对象在机器上使用,但它是授权的 Automation 对象,而且在具体的例子授权中不能确认可用。
一些对象在部件找到授权键后,才能被具体的例子说明,并且在当前的机器上的实例说明中,确认对象已被注册。当通过正确安装的类型库或对象库对一个对象进行引用时,就能自动提供正确的键。
如果 CreateObject 或 GetObject 的调用结果,是用例子说明,那么,对象必须找到键。在这种情况,它会搜寻系统注册表或查找它在安装时建立的指定文件,例如,扩展名为 .lic 的文件。如果此键找不到,则对象不能被说明。如果用户建立对象应用程序,删除必须文件,或改变系统注册表,则对象不能找到此键。如果此键找不到,对象也不能用例子说明。实例说明可在开发系统中工作,但不能在用户系统中。它对用户重装登记的对象是必须的。
4.使用 GetObject 函数获得用 Visual Basic 所创建类的引用。
GetObject 不能获得用 Visual Basic 所创建类的引用。
对该对象的访问显式地被拒绝。
例如,试图访问当前正在使用的数据对象,且此对象已被锁定以防止死锁情形发生。如果是这样的情形,可以在其他时间去访问对象。
类没有注册
这是很多人的机器上都会出现的一些情况,因为 Visual Basic 的内核是基于 ActiveX,使用 Visual Basic 的程序员可以看看自己的引用,无论是什么工程,它里面都会引用 Visual Basic For Applications、Visual Basic runtime objects and procedures、Visual Basic objects and procedures 和 OLE Automation 这四个类型库。这些都是 Visual Basic 的核心,它们是不可能去掉的。特别是 OLE Automation,虽然表面上是可以删除,但是如果你删除了会出现很多意想不到的错误,比如使用 StdPicture 对象的时候会出现问题。
不要以为某些安装程序只会安装文件,它们某些时候还会删除文件。特别是国内某些汉化人,它们制作的汉化包之中带有某些 Windows 关键文件。安装它们的 时候这些文件安装上去了。但是卸载这些程序的候,它们把一些系统文件删除掉,即使是没有删除掉。也会反注册这些文件。比如 Language Localizator,我安装它的时候,它居然把系统中的所以 Visual Basic 要使用的控件替换为英文版,而且把它们放在 C 盘的根目录下。最后卸载的时候,Visual Basic 就不能使用,包括所有 Viusual Basic 的程序都不能使用了。
CreateObject 方法与引用
但是现在 Visual Basic 都基本上不使用 CreateObject 或者是 GetObject 来返回 ActiveX 对象的引用,为什么?图个方便。因为使用 CreateObject 或者是 GetObject 的时候,我们不确定那些方法或者属性能够使用,而直接通过“引用”ActiveX,我们是可以在“对象浏览器”中方便地查看引用 ActiveX 的所有支持的方法和属性。
以下代码是使用 CreateObject 返回 FileSystemObject 对象。
'定义 Object 对象
Dim FS As Object
'使用 CreateObject 返回 FileSystemObject 对象
Set FS = CreateObject("Scripting.FileSystemObject")
如果这时候我们系统中没有 Scripting.FileSystemObject 对象,就会发生 429 错误。
以下代码是使用引用的方式直接创建 FileSystemObject 对象。
'定义 FileSystemObject 对象
Dim FS As New Scripting.FileSystemObject
如果生成的 EXE 程序运行就不会产生 429 错误,而是直接发生 339 错误(对象服务器 'item' 未正确地注册或找不到)。关于 339 错误 MSDN 中只有一个解释:
对象服务器 'item' 未正确地注册或找不到(错误 339)
这类错误有以下原因和解决方法:
1.指定的文件被移动或删除。
2.指定的文件被错误的注册。
重新安装指定的文件以正确地注册。详细信息,请参阅对象的代理商手册。
为什么这个时候发生的是 339 错误而不是 429 错误呢?因为运行 EXE 文件的时候,系统会根据 EXE 文件中引用的 CLSID 来通过注册表查找相关的引用文件的信息。而这是如果系统中没有这个信息或者注册表指向的文件不正确,就会发生 339 错误。
但是使用 CreateObject 是直接从系统中的 OLE Automation 库中查找,如果没有找到或者发生错误就会发生 429 错误。
国内大多数 Visual Basic 都是使用引用的方法,所以当文件缺丢失的时候发生的是 339 错误而不是 429 错误。
另外如果在工程中 Dim 语句中没有使用 New 关键字,而直接使用该对象的时候,也会发生 429 错误。这相当于 Delphi 中每个对象都有一个 Create 的 Constructor,在调用一个实例的过程中都需要首先调用 Constructor,最后在调用 Free 这个 Destroyer(关于 Destroy 与 Free 方法这里不作讨论)。VB 中的 Constructor 相当于 New 关键字,而 Destroyer 相当于 Set objObject = Nothing 这一句。
解决方案
1.如果是有安装程序的软件。
我们可以使用安装程序再次安装一次,以便注册所所有的组件。如果是您已经使用了安装程序,但仍然发生 429 错误,那么可能是您系统的问题,因为程序不可能没有经过测试而发布的。那么就需要您使用以下方法。
2.程序没有使用安装程序,它是绿色软件。
(1)下载 Microsoft Visual Basic 6.0 Services Pack 6 Runtime File,相关的链接在 Microsoft Knowledge Base 290887,下载地址。
(2)如果不能解决问题,请手动注册以下文件。
Oleaut32.dll Comcat.dll Msvbvm60.dll Olepro32.dll stobject.dll
注册方法是用 Regsvr32 命令。
用法: regsvr32 [/u][/s][/n][i[:cmdline]] dllname
/u - 解除服务器注册
/s - 无声 ; 不显示消息框
/i- 调用 DllInstall, 给其传递一个可选 [cmdline ]; 跟 /u 一起使用时 , 卸载 dll
/n - 不要调用 DllRegisterServer ; 这个选项必须跟 /i一起使用
比如要注册 Oleaut32.dll,就在命令提示符中输入“regsvr32 oleaut32.dll”即可。
有时候根据软件的不同还需要注册更多的文件,比如 MP3 Player Assistant 还需要注册:
scrrun.dll wmp.dll comdlg32.ocx richtx32.ocx mscomctl.ocx
您可以使用一个批处理文件来简化操作。将下面文件一次性输入到记事本中,在将它保存到 C:\ 盘,直接运行即可。
CD C:\Windows\System32
regsvr32 /s Oleaut32.dll
regsvr32 /s Comcat.dll
regsvr32 /s Msvbvm60.dll
regsvr32 /s Olepro32.dll
regsvr32 /s stobject.dll
regsvr32 /s scrrun.dll
regsvr32 /s wmp.dll
regsvr32 /s comdlg32.ocx
regsvr32 /s richtx32.ocx
regsvr32 /s mscomctl.ocx
(3)如果以上的方法都不能使用,您可是尝试安装 Microsoft Visual Basic 6.0,因为这个开发环境包括了所以需要的文件。并且他们已经都注册了。
=============
原文:
http://www.paqckt.com/flydragon/mp3pa/techinfo/429error/index.htm
=============
=============
对于您问题的解决方案:
1.联系开发者,叫他们重新封包
2.查找丢失的文件,从新注册
=============
估计缺少运行库,最好能知道该软件是用VB,VC,还是Delph编写的然后到网上下载库文件.
ActiveX 部件不能创建对象或返回对该对象的引用(错误 429)
创建对象要求该对象的类已在系统注册表中注册,而且任何相关的动态链接库 (DLL)必须能使用。此错误有以下的原因和解决方法:
• 类没有注册。例如,系统注册表中没有类的说明,或虽有类说明,但找不到文件,或指定的文件类型错误。
如果可能的话,试着启动对象的应用程序。如果注册信息过期或错误,应用程序应该检查注册表并更正信息。如果启动应用程序没有解决问题,请重新执行应用程序的安装程序。
• 对象需要的 DLL 不能使用,可能因为找不到,或是已损坏。
确保所有相关的 DLL 都可使用。例如,Data Access Object (DAO) 需要支持多平台的 DLL。如果这是造成错误的原因,则要为此对象重新执行安装程序。
• 对象在机器上使用,但它是授权的 Automation 对象,而且在具体的例子授权中不能确认可用。
一些对象在部件找到授权键后,才能被具体的例子说明,并且在当前的机器上的实例说明中,确认对象已被注册。当通过正确安装的类型库或对象库对一个对象进行引用时,就能自动提供正确的键。
如果 CreateObject 或 GetObject 的调用结果,是用例子说明,那么,对象必须找到键。在这种情况,它会搜寻系统注册表或查找它在安装时建立的指定文件,例如,扩展名为 .lic 的文件。如果此键找不到,则对象不能被说明。如果用户建立对象应用程序,删除必须文件,或改变系统注册表,则对象不能找到此键。如果此键找不到,对象也不能用例子说明。实例说明可在开发系统中工作,但不能在用户系统中。它对用户重装登记的对象是必须的。
• 使用 GetObject 函数获得用 Visual Basic 所创建类的引用。
GetObject 不能获得用 Visual Basic 所创建类的引用。
• 对该对象的访问显式地被拒绝。
例如,试图访问当前正在使用的数据对象,且此对象已被锁定以防止死锁情形发生。如果是这样的情形,可以在其他时间去访问对象。
详细信息,可选取有问题的项目,并按下 F1 (在Windows中)或HELP(在Macintosh中)键。