2011-07-29 13 views

Respuesta

10

se puede extraer iconos desde un archivo DLL con este código:

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); 

} 

... 

form.Icon = IconExtractor.Extract("shell32.dll", 42, true); 

por supuesto que necesita saber el índice de la imagen en el archivo DLL ...

1

Algunos de ellos están disponibles en %Program Files%\Microsoft Visual Studio 10.0\Common7\VS2010ImageLibrary - para los demás, que había necesidad de hablar con abogados de Microsoft acerca de las licencias para la redistribución de la aplicación

3

This thread en los foros de desarrolladores de MSDN ofrece una solución:

La forma típica de implementar esto en .NET es usar los gráficos provistos en el archivo ZIP ubicado en C: \ Archivos de programa \ Microsoft Visual Studio X \ Common7 \ VS200XImageLibrary.

No indica qué versión de Visual Studio tiene instalada, pero tendrá que reemplazar "200X" con su número de versión.

0

Vea este código. Será ayuda

public class ExtractIcon 
{ 
    [DllImport("Shell32.dll")] 
    private static extern int SHGetFileInfo(
     string pszPath, uint dwFileAttributes, 
     out SHFILEINFO psfi, uint cbfileInfo, 
     SHGFI uFlags); 

    private struct SHFILEINFO 
    { 
     public SHFILEINFO(bool b) 
     { 
      hIcon = IntPtr.Zero; iIcon = 0; dwAttributes = 0; szDisplayName = ""; szTypeName = ""; 
     } 
     public IntPtr hIcon; 
     public int iIcon; 
     public uint dwAttributes; 
     public string szDisplayName; 
     public string szTypeName; 
    }; 

    private enum SHGFI 
    { 
     SmallIcon = 0x00000001, 
     OpenIcon = 0x00000002, 
     LargeIcon = 0x00000000, 
     Icon = 0x00000100, 
     DisplayName = 0x00000200, 
     Typename = 0x00000400, 
     SysIconIndex = 0x00004000, 
     LinkOverlay = 0x00008000, 
     UseFileAttributes = 0x00000010 
    } 

    public static Icon GetIcon(string strPath, bool bSmall, bool bOpen) 
    { 
     SHFILEINFO info = new SHFILEINFO(true); 
     int cbFileInfo = Marshal.SizeOf(info); 
     SHGFI flags; 

     if (bSmall) 
      flags = SHGFI.Icon | SHGFI.SmallIcon; 
     else 
      flags = SHGFI.Icon | SHGFI.LargeIcon; 

     if (bOpen) flags = flags | SHGFI.OpenIcon; 

     SHGetFileInfo(strPath, 0, out info, (uint)cbFileInfo, flags); 

     return Icon.FromHandle(info.hIcon); 
    } 
} 
Cuestiones relacionadas