How to get the default system icon for a drive, device, or file
I am creating a remote file manager. The server side application gets a list of drivers, directories and files on the computer, saves it as a stream, and sends it to me on the current computer where I am. Everything works fine.
On the current computer, I first use the "OnCreate" event to populate the TListImage with shell icons (from the same current computer) and link it to the ListView, which will display a list of files. So, after getting the list, I use this function below to show the shared file icon in the ListView:
function GetGenericFileIconIndex(Filename: string): Integer;
var
FInfo: TSHFileInfo;
begin
Result := -1;
if (SHGetFileInfo(PChar(Filename), FILE_ATTRIBUTE_NORMAL, FInfo, SizeOf(FInfo),
SHGFI_SYSICONINDEX or SHGFI_USEFILEATTRIBUTES) <> 0) then
Result := FInfo.iIcon;
end;
for I := 0 to Pred(List.Count) do
begin
Item := ListView.Items.Add;
Item.ImageIndex := GetGenericFileIconIndex(List[I]);
Item.Caption := List[I];
end;
With the filename / extension of the file, I can get the correct shell icon even on another computer. But I also need to show the correct disk type icon. For example, on the remote computer, "D: \" is the local hard drive, but on the current computer, "D: \" is the CD / DVD drive, so I cannot use the drive letter to get this icon. I need a way to get the "generic" disk type icon ID from a remote computer (hard drive) and send it to the current computer.
For example, my goal is to get the default icon for local hard dive, default icon for remote drive, CD / DVD device, etc.
Sorry for mistakes, English is not my first language. I did my best to try and explain.
Perhaps what I need is not possible, just let me know please ...
Thank!
source to share
You definitely need to use the SHGetStockIconInfo function :
HRESULT SHGetStockIconInfo(
SHSTOCKICONID siid,
UINT uFlags,
_Inout_ SHSTOCKICONINFO *psii
);
The SHSTOCKICONIDsiid
type parameter is used to identify which stock system icon will be retrieved.
function GetDefaultSystemIcon(ASiid: Integer): Integer;
var
sInfo: TSHStockIconInfo;
begin
sInfo.cbSize := SizeOf(TSHStockIconInfo);
if S_OK = SHGetStockIconInfo(ASiid, SHGSI_SYSICONINDEX, sInfo) then
Result := sInfo.iSysImageIndex
else
Result := -1;
end;
You can call above like this GetDefaultSystemIcon(SIID_DRIVECD)
one to get the default CDROM disk icon index.
In the Microsoft documentation:
Minimum supported Windows Vista client [desktop only]
Minimum supported Windows Server 2008 [desktop only]
Older ShellAPI
units may not have a declaration SHGetStockIconInfo
: in this case, the following must be added to the Delphi project unit
.
Please note that the use of the below device is limited by the availability of the function SHGetStockIconInfo
in the system library shell32.dll, that is, the library must export this function. p>
unit MyShellAPI; interface uses Windows; type SHSTOCKICONID = Integer; _SHSTOCKICONINFO = record cbSize: Cardinal; hIcon: HICON; iSysImageIndex, iIcon: Integer; szPath: packed array [0..MAX_PATH-1] of Char; end; SHStockIconInfo = _SHSTOCKICONINFO; TSHStockIconInfo = SHSTOCKICONINFO; PSHStockIconInfo = ^TSHStockIconInfo; const //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx SHGFI_ADDOVERLAYS = $000000020; SHGFI_ATTR_SPECIFIED = $000020000; SHGFI_ATTRIBUTES = $000000800; SHGFI_DISPLAYNAME = $000000200; SHGFI_EXETYPE = $000002000; SHGFI_ICON = $000000100; SHGFI_ICONLOCATION = $000001000; SHGFI_LARGEICON = $000000000; SHGFI_LINKOVERLAY = $000008000; SHGFI_OPENICON = $000000002; SHGFI_OVERLAYINDEX = $000000040; SHGFI_PIDL = $000000008; SHGFI_SELECTED = $000010000; SHGFI_SHELLICONSIZE = $000000004; SHGFI_SMALLICON = $000000001; SHGFI_SYSICONINDEX = $000004000; SHGFI_TYPENAME = $000000400; SHGFI_USEFILEATTRIBUTES = $000000010; //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762205(v=vs.85).aspx SHGSI_ICONLOCATION = 0; SHGSI_ICON = SHGFI_ICON; SHGSI_SYSICONINDEX = SHGFI_SYSICONINDEX; SHGSI_LINKOVERLAY = SHGFI_LINKOVERLAY; SHGSI_SELECTED = SHGFI_SELECTED; SHGSI_LARGEICON = SHGFI_LARGEICON; SHGSI_SMALLICON = SHGFI_SMALLICON; SHGSI_SHELLICONSIZE = SHGFI_SHELLICONSIZE; //https://msdn.microsoft.com/en-us/library/windows/desktop/bb762542%28v=vs.85%29.aspx SIID_DOCNOASSOC = 0; SIID_DOCASSOC = 1; SIID_APPLICATION = 2; SIID_FOLDER = 3; SIID_FOLDEROPEN = 4; SIID_DRIVE525 = 5; SIID_DRIVE35 = 6; SIID_DRIVEREMOVE = 7; SIID_DRIVEFIXED = 8; SIID_DRIVENET = 9; SIID_DRIVENETDISABLED = 10; SIID_DRIVECD = 11; SIID_DRIVERAM = 12; SIID_WORLD = 13; SIID_SERVER = 15; SIID_PRINTER = 16; SIID_MYNETWORK = 17; SIID_FIND = 22; SIID_HELP = 23; SIID_SHARE = 28; SIID_LINK = 29; SIID_SLOWFILE = 30; SIID_RECYCLER = 31; SIID_RECYCLERFULL = 32; SIID_MEDIACDAUDIO = 40; SIID_LOCK = 47; SIID_AUTOLIST = 49; SIID_PRINTERNET = 50; SIID_SERVERSHARE = 51; SIID_PRINTERFAX = 52; SIID_PRINTERFAXNET = 53; SIID_PRINTERFILE = 54; SIID_STACK = 55; SIID_MEDIASVCD = 56; SIID_STUFFEDFOLDER = 57; SIID_DRIVEUNKNOWN = 58; SIID_DRIVEDVD = 59; SIID_MEDIADVD = 60; SIID_MEDIADVDRAM = 61; SIID_MEDIADVDRW = 62; SIID_MEDIADVDR = 63; SIID_MEDIADVDROM = 64; SIID_MEDIACDAUDIOPLUS = 65; SIID_MEDIACDRW = 66; SIID_MEDIACDR = 67; SIID_MEDIACDBURN = 68; SIID_MEDIABLANKCD = 69; SIID_MEDIACDROM = 70; SIID_AUDIOFILES = 71; SIID_IMAGEFILES = 72; SIID_VIDEOFILES = 73; SIID_MIXEDFILES = 74; SIID_FOLDERBACK = 75; SIID_FOLDERFRONT = 76; SIID_SHIELD = 77; SIID_WARNING = 78; SIID_INFO = 79; SIID_ERROR = 80; SIID_KEY = 81; SIID_SOFTWARE = 82; SIID_RENAME = 83; SIID_DELETE = 84; SIID_MEDIAAUDIODVD = 85; SIID_MEDIAMOVIEDVD = 86; SIID_MEDIAENHANCEDCD = 87; SIID_MEDIAENHANCEDDVD = 88; SIID_MEDIAHDDVD = 89; SIID_MEDIABLURAY = 90; SIID_MEDIAVCD = 91; SIID_MEDIADVDPLUSR = 92; SIID_MEDIADVDPLUSRW = 93; SIID_DESKTOPPC = 94; SIID_MOBILEPC = 95; SIID_USERS = 96; SIID_MEDIASMARTMEDIA = 97; SIID_MEDIACOMPACTFLASH = 98; SIID_DEVICECELLPHONE = 99; SIID_DEVICECAMERA = 100; SIID_DEVICEVIDEOCAMERA = 101; SIID_DEVICEAUDIOPLAYER = 102; SIID_NETWORKCONNECT = 103; SIID_INTERNET = 104; SIID_ZIPFILE = 105; SIID_SETTINGS = 106; SIID_DRIVEHDDVD = 132; SIID_DRIVEBD = 133; SIID_MEDIAHDDVDROM = 134; SIID_MEDIAHDDVDR = 135; SIID_MEDIAHDDVDRAM = 136; SIID_MEDIABDROM = 137; SIID_MEDIABDR = 138; SIID_MEDIABDRE = 139; SIID_CLUSTEREDDRIVE = 140; SIID_MAX_ICONS = 175; function SHGetStockIconInfo(siid: SHSTOCKICONID; uFlags: UINT; var psii: TSHStockIconInfo): HRESULT; stdcall; implementation const SHELL32 = 'shell32.dll'; function SHGetStockIconInfo; external SHELL32 name 'SHGetStockIconInfo'; end.
source to share