NativeMethods.cs

 //
// Copyright © 2006 Herbert N Swearengen III (hswear3@swbell.net)
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification,
// are permitted provided that the following conditions are met:
//
//   - Redistributions of source code must retain the above copyright notice,
//     this list of conditions and the following disclaimer.
//
//   - Redistributions in binary form must reproduce the above copyright notice,
//     this list of conditions and the following disclaimer in the documentation
//     and/or other materials provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
// IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
// OF SUCH DAMAGE.
//

using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace StartupManager
{
public class NativeMethods
    {

        #region Constructor
       
        public NativeMethods() { }
       
        #endregion

        #region API Declarations

        [DllImport("Shell32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr ExtractIcon (IntPtr hInst, string lpszExeFileName, Int32 nIconIndex);

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern Boolean DestroyIcon (IntPtr hIcon);

        #endregion

        #region Extract Icon

        /// <summary>
        /// Return first icon for an executible file.
        /// </summary>
        /// <remarks>
        /// This overload does not require an icon index.
        /// </remarks>
        public Icon GetIcon(string filePath)
        {
            try
            {
                // Extract icon 0 from filePath.
                int iconIndex = 0;
                Icon ico, clone;
                IntPtr iconHandle;

                IntPtr hInst = Marshal.GetHINSTANCE(this.GetType().Module);

                iconHandle = ExtractIcon(hInst, filePath, iconIndex);

                // Return a cloned Icon, because we have to free the original ourselves.
                ico = Icon.FromHandle(iconHandle);
                clone = (Icon)ico.Clone();
                ico.Dispose();
                DestroyIcon(iconHandle);
                return clone;

            }
            catch
            {
                // Silently fail and return a null.
                return null;
            }
        }

        /// <summary>
        /// Return first icon for an executible file.
        /// </summary>
        /// <remarks>
        /// This overload requires an icon index.
        /// </remarks>
        public Icon GetIcon(string filePath, int iconIndex)
        {
            try
            {
                Icon ico, clone;
                IntPtr iconHandle;

                IntPtr hInst = Marshal.GetHINSTANCE(this.GetType().Module);

                iconHandle = ExtractIcon(hInst, filePath, iconIndex);

                // Return a cloned Icon, because we have to free the original ourselves.
                ico = Icon.FromHandle(iconHandle);
                clone = (Icon)ico.Clone();
                ico.Dispose();
                DestroyIcon(iconHandle);
                return clone;

            }
            catch
            {
                // Silently fail and return a null.
                return null;
            }
        }

        #endregion
    }

}

Project Homepage: