在这种情况下,.NET COM Interop 类的注册表项是:-
HKEY_CLASSES_ROOT\myComLib.testObject
包含 CLSID 值和 CLSID 条目本身
HKEY_CLASSES_ROOT\CLSID\<<myComLib.testObject\CLSID value>>
它们也被复制到
HKEY_LOCAL_MACHINE\SOFTWARE\Classes
CreateObject 使用 HKEY_CLASSES_ROOT 条目来检索传入的类名的详细信息,因此如果它们丢失,您将收到
运行时错误“429”:ActiveX 组件无法创建对象
在 VB6 IDE 中,添加对 dll 的引用(对于 .NET 程序集,通过其 tlb 文件)会绕过此注册表搜索,从而允许早期绑定在没有 COM 注册表项的情况下工作。
必须正确注册该类,CreateObject 才能工作。这应该作为 Visual Studio 构建过程的一部分发生,否则需要使用 Regasm 手动注册。
您可以通过执行以下操作来测试此行为:-
1)创建一个新的VB.NET项目myComLib,在项目中注册COM Interop编译属性并添加一个类testObject
Public Class testObject
Public Property TestProperty As String
Public Function TestFunction() As String
Return "return"
End Function
End Class
2)构建myComLib
3)新建一个VB6项目,在Form1中添加两个命令按钮并添加以下代码
Private Sub Command1_Click()
Dim b As Object
Set b = New myComLib.testObject
b.TestProperty = "Hello"
MsgBox b.TestProperty, vbOKOnly, b.TestFunction()
End Sub
Private Sub Command2_Click()
Dim b As Object
Set b = CreateObject("myComLib.testObject")
b.TestProperty = "Hello"
MsgBox b.TestProperty, vbOKOnly, b.TestFunction()
End Sub
4)运行VB6项目(没有完全编译,否则会失败)
Command2 将弹出一个消息框,Command1 将失败并显示
编译错误:用户定义类型未定义。
5) 停止项目并通过其 tlb 文件添加对 myComLib 的引用
6) 运行 VB6 项目,两个按钮现在都应该可以工作了
7) 进入注册表并删除 HKEY_CLASSES_ROOT\myComLib.testObject 条目(这可以通过重建 .NET 组件来重新创建,您需要关闭 VB6 来执行重建)
Command2 现在将失败并显示
运行时错误“429”:ActiveX 组件无法创建对象
直到重新添加注册表项。