
¿Alguien sabe cómo mostrar directamente un ícono en su formato de "Registro"? Por ejemplo, "%SystemRoot%\system32\shell32.dll,112", es decir, C:\Windows\System32\shell32.dll,112, suele ser el ID de un icono tal como se encuentra en los datos de registro para el valor "IconPath". . La ruta es real, el código del ícono "112" es solo un número aleatorio.
El punto es que es engorroso encontrar el ícono correcto cuando el dll consta de cientos de íconos, incluso cuando se usa una herramienta comoExtractor de iconos, que mostrará información de los íconos cuando el cursor pase sobre los íconos. Todas estas herramientas sólo parecen funcionar al revés: hay que cargar el dll y luego esperar localizar el icono con el código correspondiente.
Respuesta1
Los iconos para tipos de archivos son recursos (es decir, cualquier tipo de imagen, medio, etc.) integrados en archivos DLL conocidos. Ese número de ícono (o índice de grupo de íconos) no es aleatorio. Los archivos DLL tienen una sección para almacenar esos recursos. Cada ícono se almacena con números únicos. Un tipo de ícono puede consistir en diferentes tamaños, dimensiones y profundidad de bits. Ese ID de ícono proviene del número de grupo de íconos, de modo que cuando el usuario cambia el nivel de zoom, solo cambia el tamaño del ícono, no el ícono en sí.
Esto se puede entender fácilmente con un ejemplo. Para este caso utilizoHacker de recursos. Aquí está la captura de pantalla de los íconos de archivos de acceso directo (extensiones .LNK) en Resource Hacker (los íconos pueden variar):
Y aquí está la configuración del registro:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\.lnk\ShellNew]
"Handler"="{ceefea1b-3e29-4ef1-b34c-fec79c4f70af}"
"IconPath"="%SystemRoot%\system32\shell32.dll,-16769"
"ItemName"="@shell32.dll,-30397"
"MenuText"="@shell32.dll,-30318"
"NullFile"=""
Vea el número "16769", compárelo con la captura de pantalla. Pero como abrirlo enHacker de recursos? Respuesta: Descargue y ejecute ese software --> Copie shell32.dll
(o cualquier archivo dll/exe) en su escritorio/carpeta de trabajo --> arrastre ese archivo a la ventana de Resource Hacker --> Haga doble clic en el "Grupo de iconos" --> Desplazarse a ese número. Vea que hay muchos íconos en un grupo de íconos con respecto a sus dimensiones 16x16, 20x20, etc. Esos son para diferentes niveles de zoom en el Explorador de archivos.
Software alternativo:Encuentre software alternativo enAlternativeTo: hacker de recursos. Éstos son algunos de ellos:
Otras lecturas:
Respuesta2
Es engorroso encontrar el ícono correcto cuando la dll consta de cientos de íconos
Puede utilizar el siguiente script de Powershell .\DisplayIcon.ps1
:
<#
.SYNOPSIS
Exports an ico and bmp file from a given source to a given destination
.Description
You need to set the Source and Destination locations. First version of a script, I found other examples
but all I wanted to do as grab and ico file from an exe but found getting a bmp useful. Others might find useful
.EXAMPLE
This will run but will nag you for input
.\Icon_Exporter.ps1
.EXAMPLE
this will default to shell32.dll automatically for -SourceEXEFilePath
.\Icon_Exporter.ps1 -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 238
.EXAMPLE
This will give you a green tree icon (press F5 for windows to refresh Windows explorer)
.\Icon_Exporter.ps1 -SourceEXEFilePath 'C:/Windows/system32/shell32.dll' -TargetIconFilePath 'C:\temp\Myicon.ico' -IconIndexNo 41
.Notes
Based on http://stackoverflow.com/questions/8435/how-do-you-get-the-icons-out-of-shell32-dll Version 1.1 2012.03.8
New version: Version 1.2 2015.11.20 (Added missing custom assembly and some error checking for novices)
#>
Param (
[parameter(Mandatory = $true)]
[string] $SourceEXEFilePath = 'C:/Windows/system32/shell32.dll',
[parameter(Mandatory = $true)]
[string] $TargetIconFilePath,
[parameter(Mandatory = $False)]
[Int32]$IconIndexNo = 0
)
$code = @"
using System;
using System.Drawing;
using System.Runtime.InteropServices;
namespace System
{
public class IconExtractor
{
public static Icon Extract(string file, int number, bool largeIcon)
{
IntPtr large;
IntPtr small;
ExtractIconEx(file, number, out large, out small, 1);
try
{
return Icon.FromHandle(largeIcon ? large : small);
}
catch
{
return null;
}
}
[DllImport("Shell32.dll", EntryPoint = "ExtractIconExW", CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]
private static extern int ExtractIconEx(string sFile, int iIndex, out IntPtr piLargeVersion, out IntPtr piSmallVersion, int amountIcons);
}
}
"@
If (-not (Test-path -Path $SourceEXEFilePath -ErrorAction SilentlyContinue ) ) {
Throw "Source file [$SourceEXEFilePath] does not exist!"
}
[String]$TargetIconFilefolder = [System.IO.Path]::GetDirectoryName($TargetIconFilePath)
If (-not (Test-path -Path $TargetIconFilefolder -ErrorAction SilentlyContinue ) ) {
Throw "Target folder [$TargetIconFilefolder] does not exist!"
}
Try {
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
Add-Type -TypeDefinition $code -ReferencedAssemblies System.Drawing
$Icon = [System.IconExtractor]::Extract($SourceEXEFilePath, $IconIndexNo, $true)
} Else {
[void][Reflection.Assembly]::LoadWithPartialName("System.Drawing")
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$image = [System.Drawing.Icon]::ExtractAssociatedIcon("$($SourceEXEFilePath)").ToBitmap()
$bitmap = new-object System.Drawing.Bitmap $image
$bitmap.SetResolution(72,72)
$icon = [System.Drawing.Icon]::FromHandle($bitmap.GetHicon())
}
} Catch {
Throw "Error extracting ICO file"
}
Try {
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
} Catch {
Throw "Error saving ICO file [$TargetIconFilePath]"
}
Write-Host "Icon file can be found at [$TargetIconFilePath]"
# Loosely based on http://www.vistax64.com/powershell/202216-display-image-powershell.html
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$img = [System.Drawing.Image]::Fromfile($TargetIconFilePath);
# This tip from http://stackoverflow.com/questions/3358372/windows-forms-look-different-in-powershell-and-powershell-ise-why/3359274#3359274
[System.Windows.Forms.Application]::EnableVisualStyles();
$form = new-object Windows.Forms.Form
$form.Text = "Image Viewer"
$form.Width = $img.Size.Width;
$form.Height = $img.Size.Height;
$pictureBox = new-object Windows.Forms.PictureBox
$pictureBox.Width = $img.Size.Width;
$pictureBox.Height = $img.Size.Height;
$pictureBox.Image = $img;
$form.controls.add($pictureBox)
$form.Add_Shown( { $form.Activate() } )
$form.ShowDialog()
#$form.Show();
Salida de ejemplo:
> .\DisplayIcon.ps1 -SourceEXEFilePath 'C:\Windows\system32\shell32.dll' -TargetIconFilePath 'f:\test\Myicon.ico' -IconIndexNo 41
Icon file can be found at [f:\test\Myicon.ico]
Notas:
- Este script se creó utilizando las fuentes que se enumeran a continuación.
- Gracias aben n.enAcceso raízpor su ayuda para depurar el código.
Fuentes: