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.