Delphi 如何获取驱动器、设备或文件的默认系统图标

Delphi 如何获取驱动器、设备或文件的默认系统图标,delphi,winapi,icons,Delphi,Winapi,Icons,我正在创建一个远程文件管理器。服务器端应用程序获取计算机中的驱动程序、目录和文件列表,将其保存为流,并将其发送到我所在的当前计算机中。一切正常 在当前计算机中,首先我使用“OnCreate”事件用shell图标(来自同一台当前计算机)填充TListImage,并将其链接到将显示文件列表的ListView。因此,收到列表后,我使用下面的函数在ListView中显示通用文件图标: function GetGenericFileIconIndex(Filename: string): Integer;

我正在创建一个远程文件管理器。服务器端应用程序获取计算机中的驱动程序、目录和文件列表,将其保存为流,并将其发送到我所在的当前计算机中。一切正常

在当前计算机中,首先我使用“OnCreate”事件用shell图标(来自同一台当前计算机)填充TListImage,并将其链接到将显示文件列表的ListView。因此,收到列表后,我使用下面的函数在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;
函数GetGenericFileIconIndex(文件名:string):整数; 变量 FInfo:TSHFileInfo; 开始 结果:=-1; 如果(SHGetFileInfo(PChar(文件名)),文件属性正常,FInfo,SizeOf(FInfo), SHGFI_SYSICONINDEX或SHGFI_USEFILEATTRIBUTES)0)然后 结果:=FInfo.iIcon; 结束; 对于I:=0到Pred(List.Count)do 开始 Item:=ListView.Items.Add; Item.ImageIndex:=GetGenericFileIconIndex(列表[I]); 项目.标题:=列表[I]; 结束; 使用文件名/扩展名,我可以获得正确的shell图标,即使在不同的计算机中也是如此。但我还需要显示正确的驱动器类型图标。例如,在远程计算机上,“D:\”是本地固定驱动器,但在当前计算机上“D:\”是CD/DVD驱动器,因此我无法使用驱动器号获取此图标。我需要一种方法从远程计算机(固定驱动器)获取“通用”驱动器类型图标索引,并将其发送到当前计算机

例如,我的目标是获取本地硬盘的默认图标、远程磁盘的默认图标、CD/DVD设备等

对不起,我错了,英语不是我的母语。我尽力解释

也许我需要的是不可能的,请让我知道


谢谢

您一定要使用:

类型的
siid
参数用于标识要检索的股票系统图标

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;
您可以这样调用上面的
GetDefaultSystemIcon(SIID\u DRIVECD)
来获取默认的CDROM驱动器图标索引


从Microsoft文档中:

支持的最小客户端Windows Vista[仅限桌面应用程序]
支持的最低服务器Windows server 2008[仅限桌面应用程序]

旧的
ShellAPI
单元可能没有
SHGetStockIconInfo
声明:在这种情况下,必须将以下
unit
添加到Delphi项目中

注意以下装置的使用仅限于shell32.dll系统库中的
SHGetStockIconInfo
函数的可用性,即导出该函数需要该库

unitmyshellapi;
接口
使用
窗户;
类型
SHSTOCKICONID=整数;
_SHSTOCKICONINFO=记录
cbSize:红衣主教;
希肯:希肯;
iSysImageIndex,
iIcon:整数;
szPath:Char的压缩数组[0..MAX_PATH-1];
结束;
SHStockIconInfo=_SHStockIconInfo;
TSHStockIconInfo=SHSTOCKICONINFO;
PSHStockIconInfo=^TSHStockIconInfo;
常数
//https://msdn.microsoft.com/en-us/library/windows/desktop/bb762179%28v=vs.85%29.aspx
SHGFI_ADDOVERLAYS=$0000000 20;
指定的SHGFI_属性=$000020000;
SHGFI_属性=$000000800;
SHGFI_DISPLAYNAME=$000000200;
SHGFI_EXETYPE=$000002000;
SHGFI_图标=000000100美元;
SHGFI_ICONLOCATION=$000001000;
SHGFI_LARGEICON=$000000000;
SHGFI_LINKOVERLAY=$000008000;
SHGFI_OPENICON=$00000000 2;
SHGFI_OVERLAYINDEX=$0000000 40;
SHGFI_PIDL=$00000000 8;
选定的上水总流量=000010000美元;
SHGFI_SHELLICONSIZE=$00000000 4;
SHGFI_SMALLICON=$00000000 1;
SHGFI_系统指数=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_图标=SHGFI_图标;
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_应用=2;
SIID_文件夹=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_驱动器=12;
SIID_WORLD=13;
SIID_服务器=15;
SIID_打印机=16;
SIID_MYNETWORK=17;
SIID_FIND=22;
SIID_HELP=23;
SIID_份额=28;
SIID_LINK=29;
SIID_SLOWFILE=30;
SIID_回收商=31;
SIID_RECYCLERFULL=32;
SIID_MEDIACDAUDIO=40;
SIID_LOCK=47;
SIID_自动列表=49;
SIID_PRINTERNET=50;
SIID_服务器共享=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_mediadvr=63;
SIID_MEDIADVDROM=64;
SIID_MEDIACDAUDIOPLUS=65;
SIID_MEDIACDRW=66;
SIID_MEDIACDR=67;
SIID_MEDIACDBURN=68;
SIID_MEDIABLANKCD=69;
SIID_MEDIACDROM=70;
SIID_音频文件=71;
SIID_图像文件=72;
SIID_视频文件=73;
SIID_MIXEDFILES=74;
SIID
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;