我正在写一个文件管理器。当它打开时,用户界面会卡住一段时间。我分析了它,发现慢函数是SHGetFileInfo。SHFILEINFOshinfo;SHGetFileInfo(FullPath.c_str(),NULL,&shinfo,sizeof(shinfo),SHGFI_ICON|SHGFI_LARGEICON))此外,即使有数百个文件夹,该程序运行速度也足够快,但当至少有一个可执行文件时,它会变得非常慢。我认为从这些文件加载图标是一项繁重的任务,因为必须加载资源。我看到当Windows资源管理器加载文件夹时,除可执行文件外的所有图标都是正确的,并且可执行文件具有其默认图标(命
我正在尝试使用SHGetFileInfo检索文件信息(特别是关于图标的信息)。实际上,我没有文件的完整路径,我只有pidl。以下代码返回(0L,(0,0,0,'',''))我的问题是为什么。fromwin32com.shellimportshell,shellcondefget_info():desktop=shell.SHGetDesktopFolder()eaten,desktop_pidl,attr=desktop.ParseDisplayName(None,None,r"C:\Users\Ella\Desktop")returnshell.SHGetFileInfo(deskt
我有以下适用于WindowsXP和Vista的代码-32位和64位:publicstaticIconGetFolderIcon(IconSizesize,FolderTypefolderType){//Needtoaddsizecheck,althougherrorsgeneratedatpresent!uintflags=Shell32.SHGFI_ICON|Shell32.SHGFI_USEFILEATTRIBUTES;if(FolderType.Open==folderType){flags+=Shell32.SHGFI_OPENICON;}if(IconSize.Small==
在.NET4.0应用程序(WPF)中,我们使用SHGetFileInfo获取目录树的shell图标。由于在某些情况下这需要相当长的时间(即对于无法访问的网络驱动器或软盘驱动器),我们希望在线程中执行此操作,然后在读入图标时更新图标。调用方式基本相同,只是在一个线程内执行。因为有人说线程必须是STA才能起作用,所以我们使用Thread而不是ThreadPool进行测试,结果相同。使用ThreadPool也不起作用。SHGetFileInfo成功(返回1),但结构中的hIcon成员为零。IntPtrGetIcon(stringname){Shell32.SHFILEINFOshfi=new
我在用着SHGetFileInfo获取文件夹和不同文件类型的图标的功能。根据MSDN该函数的呼叫应从背景线程和呼叫组件对象模型(COM)之前完成,必须使用共序化或烯烃来初始化。我的代码看起来像这样:publicvoidSetHlinkImage(stringpath){Shell32.OleInitialize(IntPtr.Zero);Tasktask=Task.Factory.StartNew(()=>{LoadIcons(path);});}privatevoidLoadIcons(stringpath){image=GetHlinkImage(path);if(OwnerControl