/// <summary>
        /// Extract the icon from file.
        /// </summary>
        /// <param name="fileAndParam">The params string,
        /// such as ex: "C:\\Program Files\\NetMeeting\\conf.exe,1".</param>
        /// <returns>This method always returns the large size of the icon (may be 32x32 px).</returns>
        public static Icon ExtractIconFromFile(string fileAndParam)
        {
            try
            {
                EmbeddedIconInfo embeddedIcon = getEmbeddedIconInfo(fileAndParam);

                //Gets the handle of the icon.
                IntPtr lIcon = ExtractIcon(0, embeddedIcon.FileName, embeddedIcon.IconIndex);

                //Gets the real icon.
                return(Icon.FromHandle(lIcon));
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }
        /// <summary>
        /// Parses the parameters string to the structure of EmbeddedIconInfo.
        /// </summary>
        /// <param name="fileAndParam">The params string,
        /// such as ex: "C:\\Program Files\\NetMeeting\\conf.exe,1".</param>
        /// <returns></returns>
        protected static EmbeddedIconInfo getEmbeddedIconInfo(string fileAndParam)
        {
            EmbeddedIconInfo embeddedIcon = new EmbeddedIconInfo();

            if (String.IsNullOrEmpty(fileAndParam))
            {
                return(embeddedIcon);
            }

            //Use to store the file contains icon.
            string fileName = String.Empty;

            //The index of the icon in the file.
            int    iconIndex       = 0;
            string iconIndexString = String.Empty;

            int commaIndex = fileAndParam.IndexOf(",");

            //if fileAndParam is some thing likes that: "C:\\Program Files\\NetMeeting\\conf.exe,1".
            if (commaIndex > 0)
            {
                fileName        = fileAndParam.Substring(0, commaIndex);
                iconIndexString = fileAndParam.Substring(commaIndex + 1);
            }
            else
            {
                fileName = fileAndParam;
            }

            if (!String.IsNullOrEmpty(iconIndexString))
            {
                //Get the index of icon.
                iconIndex = int.Parse(iconIndexString);
                if (iconIndex < 0)
                {
                    iconIndex = 0;  //To avoid the invalid index.
                }
            }

            embeddedIcon.FileName  = fileName;
            embeddedIcon.IconIndex = iconIndex;

            return(embeddedIcon);
        }
        /// <summary>
        /// Extract the icon from file.
        /// </summary>
        /// <param name="fileAndParam">The params string,
        /// such as ex: "C:\\Program Files\\NetMeeting\\conf.exe,1".</param>
        /// <param name="isLarge">
        /// Determines the returned icon is a large (may be 32x32 px)
        /// or small icon (16x16 px).</param>
        public static Icon ExtractIconFromFile(string fileAndParam, bool isLarge)
        {
            unsafe
            {
                uint     readIconCount = 0;
                IntPtr[] hDummy        = new IntPtr[1] {
                    IntPtr.Zero
                };
                IntPtr[] hIconEx = new IntPtr[1] {
                    IntPtr.Zero
                };

                try
                {
                    EmbeddedIconInfo embeddedIcon = getEmbeddedIconInfo(fileAndParam);

                    if (isLarge)
                    {
                        readIconCount = ExtractIconEx(embeddedIcon.FileName, 0, hIconEx, hDummy, 1);
                    }
                    else
                    {
                        readIconCount = ExtractIconEx(embeddedIcon.FileName, 0, hDummy, hIconEx, 1);
                    }

                    if (readIconCount > 0 && hIconEx[0] != IntPtr.Zero)
                    {
                        // Get first icon.
                        Icon extractedIcon = (Icon)Icon.FromHandle(hIconEx[0]).Clone();

                        return(extractedIcon);
                    }
                    else // No icon read
                    {
                        return(null);
                    }
                }
                catch (Exception exc)
                {
                    // Extract icon error.
                    throw new ApplicationException("Could not extract icon", exc);
                }
                finally
                {
                    // Release resources.
                    foreach (IntPtr ptr in hIconEx)
                    {
                        if (ptr != IntPtr.Zero)
                        {
                            DestroyIcon(ptr);
                        }
                    }

                    foreach (IntPtr ptr in hDummy)
                    {
                        if (ptr != IntPtr.Zero)
                        {
                            DestroyIcon(ptr);
                        }
                    }
                }
            }
        }