Hoy vamos a ver como migrar nuestra aplicación la cual tiene integrado varios controles ActiveX, para esté artículo he seleccionado Factory Talk View SE , pero es aplicable a cualquier SCADA que utilizase los controles ActiveX de Visual Basic 🙂 y aquí está con WinCC

Hace nueve años cuando todavía era fácil instalar el Visual Basic 6.0 un procedimiento que se podia utilizar era el siguiente.

Si directamente queremos insertar un control en nuestro Display


Este será el primer mensaje …


Seguido de este otro y no podemos seguir…


Lo primero que vamos a realizar es la actualización de todos los controles que vienen por defecto. Para ello vamos a descargar la KB3096896 y si lees un poco de literatura de la página verás que no se puede instalar sino tienes el IDE de VB6, pero puedes probar a ejecutarlo y esto es lo que pasará.


Vamos a proceder de la siguiente forma, vamos a extraer el contenido del *.msi. Yo he utilizado el 7zip para extraerlo y esto es lo que tenemos.


Sabiendo que estos controles pertenecen a x86 (32 bits) los he copiado directamente junto con las dependencias de las *.dll que vienen en el mismo paquete en el directorio:

C:\WINDOWS\SysWOW64


Ahora he preparado un PowerShell con mi ayudante 😉 para volver a registrar todos los controles.
Si examinas un poco mas, dentro de todos los *.cab existe otro archivo *.ini que se tiene en consideración porque tiene información adicional


Aquí tienes todo el código completo:

function Register-ActiveXFromCab {
    param (
        [Parameter(Mandatory = $true)]
        [string]$directoryPath
    )

    # Check if the provided directory exists
    if (-Not (Test-Path -Path $directoryPath)) {
        Write-Error "The specified directory does not exist."
        return
    }

    # Create a temporary directory for extracting CAB files
    $tempExtractPath = [System.IO.Path]::Combine($env:TEMP, "CabExtract")
    if (-Not (Test-Path -Path $tempExtractPath)) {
        New-Item -Path $tempExtractPath -ItemType Directory | Out-Null
    }

    # Path to x86 version of regsvr32
    $regsvr32Path = "$env:SystemRoot\SysWOW64\regsvr32.exe"

    # Get all CAB files in the directory
    $cabFiles = Get-ChildItem -Path $directoryPath -Filter *.cab

    foreach ($cabFile in $cabFiles) {
        # Extract the CAB file to the temporary directory using expand.exe
        $expandCommand = "expand.exe -F:* `"$($cabFile.FullName)`" `"$tempExtractPath`""
        Invoke-Expression $expandCommand

        # Find the INF file in the extracted content
        $infFiles = Get-ChildItem -Path $tempExtractPath -Filter *.inf

        foreach ($infFile in $infFiles) {
            try {
                # Read the INF file content
                $infContent = Get-Content -Path $infFile.FullName
                $registerFilesSection = $false
                $filesToRegister = @()

                foreach ($line in $infContent) {
                    # Check if the line indicates the start of the [RegisterFiles] section
                    if ($line -match "^\[RegisterFiles\]") {
                        $registerFilesSection = $true
                        continue
                    }
                    # Exit the section once another section starts
                    if ($registerFilesSection -and $line -match "^\[.*\]") {
                        $registerFilesSection = $false
                    }
                    # If in the [RegisterFiles] section, add the file to the list
                    if ($registerFilesSection) {
                        $filesToRegister += $line.Trim()
                    }
                }

                # Register each file listed in the [RegisterFiles] section
                foreach ($file in $filesToRegister) {
                    # Resolve the %11% placeholder to the System32 directory
                    $filePath = $file -replace "%11%", "$env:SystemRoot\SysWOW64"
                    Write-Output "Registering ActiveX control: $filePath"
                    Start-Process $regsvr32Path -ArgumentList "/s `"$filePath`"" -NoNewWindow -Wait
                }
            } catch {
                Write-Error "Failed to register ActiveX controls from: $($infFile.FullName)"
            }
        }

        # Clean up the temporary extraction directory
        Remove-Item -Path $tempExtractPath\* -Recurse -Force
    }

    # Remove the temporary extraction directory
    Remove-Item -Path $tempExtractPath -Recurse -Force

    Write-Output "ActiveX registration completed."
}


# Example usage
Register-ActiveXFromCab -directoryPath "C:\Users\Administrator\Desktop\VB60SP6-KB3096896-x86-ENU CodeProject"


La ejecución del script perfecto y ya nos queda un solo paso mas antes de terminar el proceso.


Nos faltará licenciar todos los controles, y ahora es cuando tienes que recuperar del CD de instalación el famoso archivo llamado vb6controls.reg, No recuerdo bien hasta que versión estaba incluido dicho archivo.
Si simplemente quieres probarlo, aquí tienes el listado completo


Añadimos al registro el listado y …


Ya podemos terminar de migrar nuestra aplicación con los controles ActiveX. Recuerda que simpre es mejor actualizar la versión y pasar a los controles .Net


Si comparas los controles que tenias al inicio con los que tienes ahora comprobaras , que tienes la última versión de los controles [SP6]

Y es completemanete funcional en los últimos sistemas operativos Windows 11 Professional , Windows Server 2022 Standart.