Saltar al contenido

Registro de DLL COM .Net sin derechos de administrador / regasm

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 a HKLMSoftwareClasses)
  • 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

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *