Deseamos compartir contigo la mejor solución que hallamos en línea. Nosotros queremos que te sea de mucha ayuda y si deseas compartir alguna mejora hazlo libremente.
Solución:
Configurar los archivos de registro
Para registrar los componentes para su uso en entornos de 32 y 64 bits, necesitaremos modificar el archivo de registro que creamos en nuestro caso de prueba. Ábrelo con tu editor de texto favorito. Las entradas deberían verse así:
[HKEY_CLASSES_ROOT\YourAssembly.Class] @="YourAssembly.Class" [HKEY_CLASSES_ROOT\YourAssembly.Class\CLSID] @="YourClassGUID"
Asegúrate de que incluya "CodeBase"=
entradas.
Haga una búsqueda / reemplazo global:
- Cambio
HKEY_CLASSES_ROOT
(que es alias aHKLMSoftwareClasses
) - A
HKEY_CURRENT_USERSoftwareClasses
Copiar todo el registro keys (y sus valores, que se enumeran debajo del keys) a un segundo archivo de texto. En el segundo archivo de texto:
- Eliminar todos los keys (y sus valores relacionados) que no contienen
CLSID
- Haga una búsqueda / reemplazo global:
- Cambio
ClassesCLSID
- A:
ClassesWow6432NodeCLSID
- Cambio
Copie todos los keys desde el segundo archivo de texto a su archivo .reg original y guárdelo.
Eliminar las entradas de registro de HKLM
mediante el uso de regasm:
Regasm YourDLL.dll /unregister
Asegúrate de que las cosas no funcionen
Para asegurarnos de que nuestro cambio funcionó (y que no solo tiene éxito debido al registro que hizo con regasm originalmente), debemos asegurarnos de que VBA no puede crea el objeto ahora mismo.
Abra su aplicación VBA favorita y agregue una referencia a YourDLL.tlb
. Cree un nuevo procedimiento parecido a esto:
Public Sub TestYourDLL()
Dim x as AssemblyName.ClassName
Set x = New AssemblyName.ClassName
Debug.Print "Apparently this worked."
End Sub
Correr TestYourDLL
. Debería recibir el error:
Run-time error '429': ActiveX component can't create object
(Si no recibe el error, su DLL aún está registrada).
Guarde y salga de su aplicación VBA.
Asegurándose de que funcionen
Ahora, ejecute el YourDLL.reg
que creó anteriormente para importar las entradas al registro. (Si recibe un mensaje de “Acceso denegado”, se olvidó de cambiar de HKEY_CLASSES_ROOT
a HKEY_CURRENT_USERSoftwareClasses
)
Abra su aplicación VBA nuevamente y ejecute TestYourDLL
. Ahora debería ver “Aparentemente, esto funcionó”. en su ventana inmediata. ¡Felicidades! ¡Has registrado la DLL! (Si obtiene un error de tipo “Error de automatización: el sistema no puede encontrar el archivo especificado”, su archivo de registro no tiene el Codebase
entradas, o no apuntan a la ubicación real de su DLL).
Pasos adicionales
En mi caso, voy a instalar la DLL en un montón de computadoras de otros usuarios junto con mi aplicación, así que en el momento de la instalación actualizaré la CodeBase
value para hacer referencia a la ubicación donde estoy instalando la DLL, y también instalaré las entradas del registro a través del código, en lugar de ejecutar el archivo .reg. Pero, ahora que conozco las entradas requeridas, hacerlo es trivial.
La respuesta de C White es excelente si puede hacerlo manualmente en cada computadora.
Para agregar automáticamente las entradas de registro necesarias, utilizo el siguiente código. Representa Office de 32 bits en Windows de 64 bits y se puede limpiar posteriormente.
Public Sub RegisterDLL(DLLPath As String)
Dim RegasmPath As String
RegasmPath = "C:WindowsMicrosoft.NETFramework" & Dir("C:WindowsMicrosoft.NETFrameworkv4*", vbDirectory) & "RegAsm.exe" 'Path to RegAsm, adjust to the version of the .Net framework you're targeting
#If Win64 Then
Const Win64 = True
#Else
Const Win64 = False
#End If
Dim LibraryPath As String
LibraryPath = Left(DLLPath, Len(DLLPath) - 4)
If Dir(DLLPath) = "" Then 'Check if file exists
Err.Raise 1, Description:="Missing DLL!"
Exit Sub
End If
CreateObject("WScript.Shell").Run """" & RegasmPath & """ """ & DLLPath & """ /codebase /regfile", 0, True 'Create .reg file using RegAsm
Dim strNewRegPath As String
If Not Win64 And Environ$("ProgramW6432") <> vbNullString Then
strNewRegPath = "HKEY_CURRENT_USERSOFTWAREClassesWow6432Node" '32 bits Office on Win 64
Else
strNewRegPath = "HKEY_CURRENT_USERSOFTWAREClasses" 'Default registry path
End If
Dim strRegFileContent As String
Dim fileNo As Integer
fileNo = FreeFile
Open LibraryPath & ".reg" For Binary Access Read Write As #fileNo
strRegFileContent = String(LOF(fileNo), vbNullChar)
Get #fileNo, , strRegFileContent 'Read reg contents
strRegFileContent = Replace(strRegFileContent, "HKEY_CLASSES_ROOT", strNewRegPath) 'Change reg path
Put #fileNo, 1, strRegFileContent 'Overwrite, always extends so no need to truncate
Close #fileNo
CreateObject("WScript.Shell").Run "regedit.exe /s """ & LibraryPath & ".reg""", 0, True 'Merge silently into registry
Kill LibraryPath & ".reg" 'Clean up registry
End Sub
Solo usa RegisterDLL "C:PathToFile.DLL"
para agregar automáticamente las entradas requeridas.
Para limpiar al desinstalar, puede utilizar lo siguiente:
Public Sub UnregisterDLL(DLLPath As String)
Dim RegasmPath As String
RegasmPath = "C:WindowsMicrosoft.NETFramework" & Dir("C:WindowsMicrosoft.NETFrameworkv4*", vbDirectory) & "RegAsm.exe" 'Path to RegAsm, adjust to the version of the .Net framework you're targeting
#If Win64 Then
Const Win64 = True
#Else
Const Win64 = False
#End If
Dim LibraryPath As String
LibraryPath = Left(DLLPath, Len(DLLPath) - 4)
If Dir(DLLPath) = "" Then 'Check if file exists
Err.Raise 1, Description:="Missing DLL!"
Exit Sub
End If
CreateObject("WScript.Shell").Run """" & RegasmPath & """ """ & DLLPath & """ /codebase /regfile", 0, True 'Create .reg file using RegAsm
Dim strNewRegPath As String
If Not Win64 And Environ$("ProgramW6432") <> vbNullString Then
strNewRegPath = "HKEY_CURRENT_USERSOFTWAREClassesWow6432Node" '32 bits Office on Win 64
Else
strNewRegPath = "HKEY_CURRENT_USERSOFTWAREClasses" 'Default registry path
End If
Dim strRegFileContent As String
Dim fileNo As Integer
fileNo = FreeFile
Dim fileOutput As Integer
fileOutput = FreeFile + 1
Open LibraryPath & ".reg" For Input As #fileNo
Open LibraryPath & "remove.reg" For Output As #fileOutput
Line Input #fileNo, strRegFileContent 'Read reg contents
Print #fileOutput, strRegFileContent 'Copy first line blindly
Do While Not EOF(fileNo)
Line Input #fileNo, strRegFileContent 'Read reg contents
strRegFileContent = Replace(strRegFileContent, "HKEY_CLASSES_ROOT", strNewRegPath) 'Change reg path
If Left(strRegFileContent, 1) = "[" Then 'If new key
Print #fileOutput, "[-" & Mid(strRegFileContent, 2) 'Change to remove key
End If
Loop
Close #fileOutput
Close #fileNo
Kill LibraryPath & ".reg" 'Remove create file
Shell "regedit.exe /s """ & LibraryPath & "remove.reg""" 'Merge silently into registry
Kill LibraryPath & "remove.reg" 'Remove delete file
End Sub
Estos scripts no requieren referencias ni acceso de administrador. Por lo general, deben ejecutarse rápido y permitir la configuración al inicio de la aplicación y la limpieza al cerrar la aplicación, si los conflictos pudieran ser un problema.
Si aceptas, eres capaz de dejar un ensayo acerca de qué le añadirías a esta división.