Las entradas del registro para la clase de .NET de interoperabilidad COM en este caso son: -
HKEY_CLASSES_ROOT\myComLib.testObject
que contiene un valor CLSID y la entrada CLSID sí
HKEY_CLASSES_ROOT\CLSID\<<myComLib.testObject\CLSID value>>
Son también replicado en
HKEY_LOCAL_MACHINE\SOFTWARE\Classes
CreateObject utiliza las entradas HKEY_CLASSES_ROOT para recuperar los detalles del nombre de la clase aprobada en lo que si que se pierden recibirá
Run-time error '429': ActiveX component can't create object
dentro del IDE de VB6, añadir una referencia a la DLL (en el caso de una El ensamblado .NET, a través de su archivo tlb) pasa por alto esta búsqueda de registro, lo que permite que el enlace anticipado funcione sin las entradas de registro COM.
La clase debe registrarse correctamente para que CreateObject funcione. Esto debería ocurrir como parte del proceso de compilación de Visual Studio; de lo contrario, debe registrarse manualmente usando Regasm.
Esto se comprueba el comportamiento de la siguiente manera: -
1) Crear un nuevo VB.myComLib NET registrarse para interoperabilidad COM en el proyecto Compilar propiedades y añadir una clase testObject
Public Class testObject
Public Property TestProperty As String
Public Function TestFunction() As String
Return "return"
End Function
End Class
2) Construir myComLib
3) Crear un nuevo proyecto de Visual Basic 6, agregue dos botones de comando a Form1 y el siguiente código
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) Ejecutar el proyecto de VB6 (sin compilación completa como que se producirá un error)
Comando2 emergerá un cuadro de mensaje, Comando 1 fallará con
Compile Error: User-defined type not defined.
5) Detener el proyecto y agregar una referencia a myComLib a través de su TLB archivo
6) Ejecutar el proyecto de VB6 y los dos botones debería funcionar
7) Id por el registro y borrar el registro HKEY_CLASSES_ROOT \ myComLib.testObject (esto se puede volver a crear mediante la reconstrucción del componente .NET, tendrá que cerrar VB6 para llevar a cabo la reconstrucción)
Comando2 ahora fallará con
Run-time error '429': ActiveX component can't create object
hasta que se vuelva a agregar la entrada del registro.
acabo intentado esto y ambos métodos de trabajo. Estoy en XP y agregué myComLib.tlb como referencia al proyecto. ¿Estás en XP o Win7? –
estoy usando xp. He registrado la biblioteca y también he copiado en la carpeta del proyecto (archivo dll y tlb). También he agregado una referencia al proyecto. Es por eso que el enlace temprano funciona. La vinculación tardía también debería funcionar. También intenté agregar un referencia a scrrun.dll pero aún nada. – reven