Я пытаюсь получить значки файлов и папок в папке system32, но получаю "System.ArgumentException" in System.Drawing.dll
в разных файлах.Получить все значки из папки system32. System.ArgumentException
создать класс:
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public IntPtr iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
class Win32
{
public const uint SHGFI_ICON = 0x100;
//public const uint SHGFI_LARGEICON = 0x0; // 'Large icon
public const uint SHGFI_SMALLICON = 0x1; // 'Small icon
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[DllImport("gdi32.dll", SetLastError = true)]
public static extern bool DeleteObject(IntPtr hObject);
}
и получить значок:
private Icon GetIcon(string filePatch)
{
Icon icon;
SHFILEINFO shinfo = new SHFILEINFO();
IntPtr hIconSmall = Win32.SHGetFileInfo(filePatch, 0, ref shinfo, /*(uint)Marshal.SizeOf(shinfo)*/ 80, Win32.SHGFI_ICON | Win32.SHGFI_SMALLICON);
if (hIconSmall == IntPtr.Zero)
{
icon = iconUnknown;
}
else
{
icon = Icon.FromHandle(shinfo.hIcon);
//"System.ArgumentException" in System.Drawing.dll
}
Win32.DeleteObject(shinfo.hIcon);
return (icon);
}
Я знаю, что нужно DeleteObject
, но это, кажется, не происходит. Что я делаю не так?
PS: А в проекте свойств проверить Any CPU
Я вижу что вы проверяете, есть ли файл сейчас. Я сделал проводник файлов через сокет. Я знаю, что у меня была проблема с этим, что расширение не было известно. У меня нет решения, но я могу дать вам код, который сработал для меня –
@TimonPost Ошибка в разных файлах, похоже, не работает DeleteObject. Если я получаю значок только с одним файлом, который только что вызвал ошибку, все работает. И я думаю, было бы полезно увидеть ваш код. – DartAlex