Как вы получаете значки из shell32.dll? - PullRequest
40 голосов
/ 12 августа 2008

Мне бы хотелось, чтобы значок дерева использовался для доморощенного приложения. Кто-нибудь знает, как извлечь изображения в виде файлов .icon? Я бы хотел 16x16 и 32x32, или я бы просто сделал снимок экрана

Ответы [ 10 ]

41 голосов
/ 12 августа 2008

В Visual Studio выберите «Файл открыт ...», а затем «Файл ...». Затем выберите Shell32.dll. Дерево папок должно быть открыто, и вы найдете значки в папке «Icon».

Чтобы сохранить значок, вы можете щелкнуть правой кнопкой мыши значок в дереве папок и выбрать «Экспорт».

37 голосов
/ 14 июня 2016

Если кто-то ищет простой способ, просто используйте 7zip, чтобы разархивировать shell32.dll и найдите папку .src / ICON /

18 голосов
/ 12 августа 2008

Другой вариант - использовать такой инструмент, как ResourceHacker . Он обрабатывает гораздо больше, чем просто значки. Ура!

8 голосов
/ 22 января 2015

Мне нужно было извлечь значок # 238 из shell32.dll, и я не хотел загружать Visual Studio или Resourcehacker, поэтому я нашел пару сценариев PowerShell из Technet (спасибо Джону Гренфеллу и # https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell), что сделал что-то похожее и создал новый скрипт (ниже), чтобы удовлетворить мои потребности.

Я ввел следующие параметры (исходный путь к DLL, имя файла значка назначения и индекс значка в файле DLL):

C: \ Windows \ System32 \ shell32.dll

C: \ Temp \ Restart.ico

238

Я обнаружил, что нужный мне значок индекса был # 238 методом проб и ошибок, временно создав новый ярлык (щелкните правой кнопкой мыши на рабочем столе и выберите «Создать» -> «Ярлык», введите «calc» и дважды нажмите «Enter»). Затем щелкните правой кнопкой мыши новый ярлык и выберите «Свойства», затем нажмите кнопку «Изменить значок» на вкладке «Ярлык». Вставьте путь C: \ Windows \ System32 \ shell32.dll и нажмите ОК. Найдите значок, который вы хотите использовать, и определите его индекс. NB. Индекс № 2 находится под номером 1, а не справа. Значок индекса № 5 находился в верхней части второго столбца на моем компьютере с Windows 7 x64.

Если у кого-то есть лучший метод, который работает аналогичным образом, но получает значки более высокого качества, мне было бы интересно узнать об этом. Спасибо, Шон.

#Windows PowerShell Code###########################################################################
# http://gallery.technet.microsoft.com/scriptcenter/Icon-Exporter-e372fe70
#
# AUTHOR: John Grenfell
#
###########################################################################

<#
.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
   No error checking I'm afraid so make sure your source and destination locations exist!
.EXAMPLE
    .\Icon_Exporter.ps1
.Notes
        Version HISTORY:
        1.1 2012.03.8
#>
Param ( [parameter(Mandatory = $true)][string] $SourceEXEFilePath,
        [parameter(Mandatory = $true)][string] $TargetIconFilePath
)
CLS
#"shell32.dll" 238
If ($SourceEXEFilePath.ToLower().Contains(".dll")) {
    $IconIndexNo = Read-Host "Enter the icon index: "
    $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())
}
$stream = [System.IO.File]::OpenWrite("$($TargetIconFilePath)")
$icon.save($stream)
$stream.close()
Write-Host "Icon file can be found at $TargetIconFilePath"
5 голосов
/ 06 апреля 2013

Извлечение ресурсов - это еще один инструмент, который будет рекурсивно находить значки из множества библиотек DLL, очень удобный IMO.

3 голосов
/ 20 ноября 2015

Вот обновленная версия решения выше. Я добавил недостающую сборку, которая была похоронена в ссылке. Новички не поймут этого. Этот образец будет работать без изменений.

    <#
.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 /16683/kak-vy-poluchaete-znachki-iz-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
)

#https://social.technet.microsoft.com/Forums/windowsserver/en-US/16444c7a-ad61-44a7-8c6f-b8d619381a27/using-icons-in-powershell-scripts?forum=winserverpowershell
$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
        $form = New-Object System.Windows.Forms.Form
        $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]"
2 голосов
/ 12 ноября 2014

Вы можете скачать бесплатное Resource Hacker и затем следовать приведенным ниже инструкциям:

  1. Откройте любой файл DLL, в котором вы хотите найти значки.
  2. Просматривайте папки, чтобы найти определенные значки.
  3. В строке меню выберите «действие», а затем «сохранить».
  4. Выберите место назначения для файла .ico.

Ссылка: http://techsultan.com/how-to-extract-icons-from-windows-7/

2 голосов
/ 22 мая 2014

Просто откройте DLL с помощью IrfanView и сохраните результат в формате .gif или .jpg.

Я знаю, что этот вопрос старый, но это второй гугл-запрос из "Извлечь значок из DLL", я хотел избежать установки чего-либо на свою рабочую станцию ​​и вспомнил, что использую IrfanView.

1 голос
/ 23 марта 2017

Также доступен этот ресурс, библиотека изображений Visual Studio, которая "может использоваться для создания приложений, визуально совместимых с программным обеспечением Microsoft", предположительно, в соответствии с лицензией, приведенной внизу. https://www.microsoft.com/en-ca/download/details.aspx?id=35825

1 голос
/ 23 июля 2014

Если вы работаете в Linux, вы можете извлечь иконки из Windows DLL с помощью gExtractWinIcons . Он доступен в Ubuntu и Debian в пакете gextractwinicons.

Эта статья блога имеет снимок экрана и краткое объяснение .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...