ExtractAssociatedIcon Help!!!

Hello,

I'm trying to extract icon from exe files during runtime, i know about the following function.

Icon ico = Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe");
this.Icon = ico;

The problem is when i save the icon object to the disk!!

MemoryStream Memo = new MemoryStream();

ico .Save(Memo );

File.WriteAllByte(@"C:\DLICO.Ico", Memo );

The above code should write the icon to C:\ the icon is saved but its deformed!!, i mean its colors looks very bad, can any one help, mention that the icon appear correctly in this line this.Icon = ico; but the saved icon appear very bad.

Please help, thanks




Answer this question

ExtractAssociatedIcon Help!!!

  • Evan Mulawski

    Hello All.

    Dominator Legend:

    Check out this article. It was linked in this thread on the forums. Explains what the problem is and how to fix it.

    HTH.



  • Noel Muhleisen

    Thanks a lot Mark,

    Extracting Icon using API is long process, but its the only way to extract good quality icon.

    I think there is a bug in Icon class. thanks for your link.



  • J Andrews

    Any help please.

    Thanks.



  • Mapa3matuk

    Dominator Legend wrote:

    Thanks Paul for your replay, the problem is not how to get the icon your class get the icon, the problem how to save that icon to the disk, the .Save function deforme the icon,

    Any way thanks a lot for your post :).

    Chear.

    No problem, was the first part not useful either Or did you need it in the ico format


  • nCognito

    Thanks Paul for your replay, the problem is not how to get the icon your class get the icon, the problem how to save that icon to the disk, the .Save function deforme the icon,

    Any way thanks a lot for your post :).

    Chear.



  • walkingboy

    I'm building an app. that take as an input exe file and encapsulate the input file into new created exe file, the new exe file should have the same icon as the input, i try to get the icon, and then convert it to Bmp, and save the Bmp file with Ico format, the icon extracted correctly and colors was good, but the problem is that its not a standard icon which mean when i try to open it using any icon editor it can't recognize it, but the shell render it correctly, i don't know what is wrong with these classes.

    Any way thanks again for your posts :)



  • JPedroFS

    Not sure why the icon isn't saving properly.  Does seem like a bug in the icon Save method.  But this works if you don't mind saving as a bitmap:

    Icon icon = Icon.ExtractAssociatedIcon(@"C:\WINDOWS\system32\notepad.exe");
    icon.ToBitmap().Save(@"C:\DLICO.bmp");

    or use this class to extract the icon:

     

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

        [StructLayout(LayoutKind.Sequential)]
        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;

            [MarshalAs(UnmanagedType.LPStr, SizeConst = 260)]
            public string szDisplayName;

            [MarshalAs(UnmanagedType.LPStr, SizeConst = 80)]
            public string szTypeName;
        };

        private ExtractIcon()
        {
        }

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

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

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

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

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


  • Peter Smith

    Yeah the icon file-format has always seemed a bit of a black-sheep of the image file-format family!


  • ExtractAssociatedIcon Help!!!