`
dato0123
  • 浏览: 913440 次
文章分类
社区版块
存档分类
最新评论

刷新IE收藏夹图标

 
阅读更多
原文链接:FavIconizer


遍历文件夹工具类:

classCDirFileList:publicCStringArray
{
public:
CDirFileList();

/**//**
*fillsthearraywithallfilesfoundinthegivendirectory.
*/paramdirNamethepathtothedirectoryonwhichthefilesshallbelookedfor
*/paramrecurseTRUEifyouwanttorecurseintosubdirectories
*/paramincludeDirsTRUEifyouwanttoadddirectoriestothearraytoo
*/

voidBuildList(constCStringdirName,constBOOLrecurse,constBOOLincludeDirs);
}
;

CDirFileList::CDirFileList()
{
SetSize(
0,50);
}


voidCDirFileList::BuildList(constCStringdirName,constBOOLrecurse,constBOOLincludeDirs)
{
CFileFindfinder;
BOOLworking
=finder.FindFile(dirName+_T("//*.*"));
while(working)
{
working
=finder.FindNextFile();
//skip"."and".."
if(finder.IsDots())
continue;

//ifitsadirectorythenrecurse
if(finder.IsDirectory())
{//是文件夹
if(includeDirs)
{//若结果要求保存文件夹
Add(finder.GetFilePath());
}

if(recurse)
{//递归下一层
BuildList(finder.GetFilePath(),recurse,includeDirs);
}

}
//if(finder.IsDirectory())
else
{//是文件
Add(finder.GetFilePath());
}

}
//while(working)
finder.Close();
}


判断是否是图标文件:

typedefstructtagICONDIRENTRY
{
BYTEbWidth;
BYTEbHeight;
BYTEbColorCount;
BYTEbReserved;
WORDwPlanes;
WORDwBitCount;
DWORDdwBytesInRes;
DWORDdwImageOffset;
}
ICONDIRENTRY;

typedef
structICONHEADER
{
WORDidReserved;
WORDidType;
WORDidCount;
ICONDIRENTRYidEntries[
1];
}
ICONHEADER;
BOOLCFavIconizerDlg::IsIconOrBmp(BYTE
*pBuffer,DWORDdwLen)
{
//Quickanddirtychecktoseeifweactuallygot
//aniconorabitmap
ICONHEADER*pIconHeader=(ICONHEADER*)pBuffer;
ICONDIRENTRY
*pIconEntry=(ICONDIRENTRY*)(pBuffer+sizeof(WORD)*3);
BITMAPFILEHEADER
*pBmpHeader=(BITMAPFILEHEADER*)pBuffer;

if((pIconHeader->idType==1)
&&
(pIconHeader
->idReserved==0)
&&
(dwLen
>=sizeof(ICONHEADER)+sizeof(ICONDIRENTRY)))
{
if(pIconEntry->dwImageOffset>=dwLen)
gotocheckifbmp;

returnTRUE;
}


//Notanicon
checkifbmp:

BITMAPFILEHEADER
*pBmpFileHeader=(BITMAPFILEHEADER*)pBuffer;
BITMAPINFOHEADER
*pBmpInfoHeader=(BITMAPINFOHEADER*)(pBuffer+sizeof(BITMAPFILEHEADER));

if((dwLen<sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER))
||
(pBmpFileHeader
->bfType!=BM)
||
(pBmpFileHeader
->bfSize!=dwLen))
returnFALSE;

returnTRUE;
}


刷新IE收藏夹图标:


DWORDCFavIconizerDlg::ThreadMethod()
{
//InitialisetheOLEsubsystem
HRESULThRes=::CoInitialize(NULL);
CStringresult;
intnIcons=0;
if(!SUCCEEDED(hRes))
{
MessageBox(_T(
"FailedtoinitializeOLE!"),_T("Error"),MB_OK|MB_ICONEXCLAMATION);
return1;
}
//if(!SUCCEEDED(hRes))
GetDlgItem(IDOK)->SetWindowText(_T("Abort"));
//firstgetthefavoritesfolderofthecurrentuser
TCHARbuf[MAX_PATH];
//获取“收藏夹”路径
if(!SHGetSpecialFolderPath(this->m_hWnd,buf,CSIDL_FAVORITES,FALSE))
{
//nofavoritesfolder?
MessageBox(_T("couldnotlocateyourfavoritesfolder!"),_T("Error"),MB_OK|MB_ICONEXCLAMATION);
::CoUninitialize();
GetDlgItem(IDOK)
->SetWindowText(_T("OK"));
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("finished!"));
GetDlgItem(IDC_LINKPATH)
->SetWindowText(_T(""));
UpdateData(FALSE);
return1;
}

CStringsFavPath
=CString(buf);
if(!SetCurrentDirectory(sFavPath))
{
MessageBox(_T(
"couldnotsetthecurrentdirectory!"),_T("Error"),MB_OK|MB_ICONEXCLAMATION);
::CoUninitialize();
GetDlgItem(IDOK)
->SetWindowText(_T("OK"));
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("finished!"));
GetDlgItem(IDC_LINKPATH)
->SetWindowText(_T(""));
UpdateData(FALSE);
return1;
}

sFavPath
+="//";
CStringsFavIconPath
=sFavPath+"_icons";
//创建隐藏的图标文件夹保存图标
CreateDirectory(sFavIconPath,NULL);
SetFileAttributes(sFavIconPath,FILE_ATTRIBUTE_HIDDEN);

//gatheralistofalllinksinthefavoritesfolder
CDirFileListfilelist;
filelist.BuildList(sFavPath,TRUE,FALSE);

m_totalProgress.SetRange(
0,filelist.GetCount());
m_totalProgress.SetStep(
1);
for(inti=0;i<filelist.GetSize();i++)
{
//iteratethroughalllinks
CStringlinkfile=filelist.GetAt(i);
CUrlShellLinklink;
if(!link.Load(linkfile))
continue;
GetDlgItem(IDC_LINKPATH)
->SetWindowText(linkfile.Right(linkfile.GetLength()-linkfile.ReverseFind('//')-1));
if(link.GetPath().Left(4).CompareNoCase(_T("http"))==0)
{
//yes,it'sanurltohttp
CStringiconURL;
try
{
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("connecting"));
CInternetSessionsession;
//尝试连接
CStdioFile*pHtmlFile=session.OpenURL(link.GetPath(),1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_EXISTING_CONNECT|INTERNET_FLAG_NO_COOKIES);
if(pHtmlFile==NULL)
continue;
//nowreadthehtmlfileandsearchfor<LINKREL="SHORTCUTICON"
CStringhtmlline;
CStringhtmlheader;
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("receivingpage"));
while(pHtmlFile->ReadString(htmlline))
{
htmlheader
+=htmlline;
//weassumeherethatthehtmltagforthefaviconisnot
//splitoverseverallinesorhasseveralwhitespacesinit
//thiswon'tworkinallcasesbutarealparserjustfor
//thefaviconsislikekillingflieswitharocket
CStringtemp=htmlheader;
temp.MakeUpper();
if(temp.Find(_T("</HEAD>"))>=0)
{
//endofheaderfound
intpos=temp.Find(_T("<LINKREL=/"SHORTCUTICON/""));
if(pos<0)
pos
=temp.Find(_T("<LINKREL=/"ICON/""));
if(pos>=0)
{
//intstartpos=temp.Find(_T("HREF=/""),pos)+6;
//intendpos=temp.Find(_T("/""),startpos);
//iconURL=htmlheader.Mid(startpos,endpos);

//iconURL=temp.Mid(pos);
iconURL=htmlheader.Mid(temp.Find(_T("HREF=/""),pos)+6);
iconURL=iconURL.Left(iconURL.Find(_T("/"")));
GetDlgItem(IDC_LINKSTATUS)->SetWindowText(_T("icontagfound!"));
}
//if(pos>=0)
break;
}
//if(htmlheader.Find(_T("</HEAD>"))>=0)
}
//while(pHtmlFile->ReadString(htmlline))
pHtmlFile->Close();
deletepHtmlFile;
session.Close();
}

catch(CInternetException*pEx)
{
pEx
->Delete();
}

if(iconURL.IsEmpty())
{
iconURL
=_T("favicon.ico");
DWORDdwService;
CStringstrServer;
CStringstrObject;
INTERNET_PORTnPort;
AfxParseURL(link.GetPath(),dwService,strServer,strObject,nPort);
iconURL
=_T("http://")+strServer+_T("/")+iconURL;
}
//if(iconURL.IsEmpty())
else
{
if(!iconURL.Left(4).CompareNoCase(_T("http"))==0)
{
//notafullURLbutarelativeone
if(iconURL.GetAt(0)=='/')
{
DWORDdwService;
CStringstrServer;
CStringstrObject;
INTERNET_PORTnPort;
AfxParseURL(link.GetPath(),dwService,strServer,strObject,nPort);
iconURL
=_T("http://")+strServer+_T("/")+iconURL;
}
//if(iconURL.GetAt(0)=='/')
else
{
iconURL
=link.GetPath().Left(link.GetPath().ReverseFind('/')+1)+iconURL;
}

}
//if(!iconURL.Left(4).CompareNoCase(_T("http"))==0)
}

if(!m_runthread)
break;
//it'stimetofetchtheicon
try
{
//取图标文件
CInternetSessioniconsession;
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("gettingicon"));
CStdioFile
*pIconFile=iconsession.OpenURL(iconURL,1,INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_EXISTING_CONNECT);
GetTempPath(
sizeof(buf)/sizeof(TCHAR),buf);
TCHARtempfilebuf[MAX_PATH];
GetTempFileName(buf,_T(
"fav"),0,tempfilebuf);
_tcscat(tempfilebuf,_T(
".ico"));
CFileiconfile;
iconfile.Open(tempfilebuf,CFile::modeCreate
|CFile::modeReadWrite);
intlen=0;
while(len=pIconFile->Read(buf,sizeof(buf)))
{
iconfile.Write(buf,len);
}

iconfile.Close();
pIconFile
->Close();
deletepIconFile;
iconsession.Close();
//nowcheckifit'sreallyaniconwegot
BOOLisIcon=FALSE;
if(iconfile.Open(tempfilebuf,CFile::modeRead|CFile::typeBinary))
{
intnSize=(int)iconfile.GetLength();
BYTE
*pBuffer=newBYTE[nSize];

if(iconfile.Read(pBuffer,nSize)>0)
{
if(IsIconOrBmp(pBuffer,nSize))//检查是否是图标
isIcon=TRUE;
}


iconfile.Close();
delete[]pBuffer;
}

if(isIcon)
{
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("storingicon"));
CStringiconpath
=_T("_icons//")+linkfile.Right(linkfile.GetLength()-linkfile.ReverseFind('//')-1);
iconpath
=iconpath.Left(iconpath.ReverseFind('.'))+_T(".ico");
DeleteFile(iconpath);
MoveFile(tempfilebuf,iconpath);
link.SetIconLocation(iconpath);
link.SetIconLocationIndex(
0);
link.Save(linkfile);
nIcons
++;
}
//if(isIcon)
else
{
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("noiconfound!"));
DeleteFile(tempfilebuf);
}

}

catch(CInternetException*pEx)
{
pEx
->Delete();
}

catch(CFileException*pEx)
{
pEx
->Delete();
}

}
//if(link.GetPath().Left(4).CompareNoCase(_T("http"))==0)
if(!m_runthread)
break;
m_totalProgress.StepIt();
result.Format(_T(
"%dof%dlinksprocessed.%diconsfound"),i+1,filelist.GetSize(),nIcons);
GetDlgItem(IDC_RESULT)
->SetWindowText(result);

}
//for(inti=0;i<filelist.GetSize();i++)

//ClosedowntheOLEsubsystem
::CoUninitialize();
GetDlgItem(IDOK)
->SetWindowText(_T("OK"));
GetDlgItem(IDC_LINKSTATUS)
->SetWindowText(_T("finished!"));
GetDlgItem(IDC_LINKPATH)
->SetWindowText(_T(""));

return0;
}


分享到:
评论

相关推荐

    世界之窗3.0.2.6论坛预览版

    改进了收藏栏不显示图标的功能,即使勾选这个功能也不再隐藏添加及网络收藏夹图标了 改进了下载窗口,当没有下载任务时,关闭主程序同时退出下载窗口 改进了快捷键的处理顺序,优先处理网页上的快捷键 改进了地址栏...

    网际畅游 MyIE 3.0 源代码

    收藏夹: MyIE具有和IE一致的添加到收藏夹,组织收藏夹,导出/导入收藏夹。 打开本层链接:收藏夹菜单中每级都有一项打开本层链接的菜单。 使用它可以打开这一层收藏夹的所有链接。 打开所有链接:链接栏上的...

    BitComet_1.32种子市场版

    界面改进:改变主窗口宽度时,保持左侧收藏夹宽度不变 界面改进:从文件加载URL列表进行批量下载时,提示检测到的重复的URL数量 界面修正:程序启动时没有恢复任务列表排序 界面修正:下载磁链时,新建任务...

    世界之窗浏览器(TheWorld) v2.1.1.7 Beta 多国语言安装版

    更新摘要:修复了黑名单过滤和NOD32的Imon模块的冲突问题修复了一处由于网站响应慢而可能导致假死的问题增加了对IE工具条插件的支持增加了我的最爱功能,在收藏夹的右键菜单上可以设置增加了错误控制台功能增加了...

    300个注册表优化修改文件

    不显示开始菜单中收藏夹菜单.reg 不显示上次登录的用户名.reg 打造独具特色的电脑标识.reg 调整Windows XP的浏览速度.reg 定制进入Windows前的欢迎信息.reg 改变菜单及工具提示的转换效果.reg 改变窗口变化时的...

    js使用小技巧

    整理收藏夹 onclick="window.external.ShowBrowserUI("OrganizeFavorites", null)"&gt; 语言设置 onclick="window.external.ShowBrowserUI("LanguageDialog", null)"&gt; 加入收藏夹 onclick="window.external....

    最新网管精华实用技巧170篇免费下载(网管的必备)

    如何移动收藏夹 如何隐藏磁盘驱动器 如何优化BIOS 如何找到自启动程序 如何自动重启 删除NTFS分区 删除屏幕保护和壁纸 删除系统备份文件 删除信使服务 设置窗口自动刷新 设置任务管理器 设置虚拟内存 ...

    55种网页小技巧 ---- 下载无需扣分,具有一定收藏价值

    可以在收藏夹中显示出你的图标 .html 各种样式的光标.html 回车键换行.html 在打开的子窗口刷新父窗口的代码里如何写.html 在网页中用按钮来控制前页,后页和主页的显示.html 在规定时间内跳转.html 在页面中...

    Windows问答精华

    如何移动收藏夹.txt 如何自动重启.txt 如何让注册表保持在根目录.txt 如何设置从光驱启动.txt 如何设置显别人的IP.txt 如何设置显示器.txt 如何进入BIOS设置.txt 如何重新安装IE浏览器.txt 如何锁住桌面背景.txt ...

    KODExplorer 芒果云-资源管理器

    - 修复添加收藏夹问题(已打开设置窗口再添加失败问题) - 修复树目录中文文件名bug - 优化pic图片幻灯片播放 - 优化新建文件&文件夹 清空选择状态 - 对话框组件 ie8 优化;tips不显示任务栏; - 优化地址栏过...

    Maxthon2.0.2.2961苦菜花增强清爽精简版

    (13837) * 单行收藏夹的添加或删除按钮里面无法选择按钮, 并且最热条目按钮的名字为 aa (13940) * 广告猎手编辑过滤列表时按 Esc 键对话框变灰 (14049) * 地址栏在当前页面跳转的时候会刷新 (16748) * ...

    Maxthon2.0.2.2961苦菜花增强优化安装版

    (13837) * 单行收藏夹的添加或删除按钮里面无法选择按钮, 并且最热条目按钮的名字为 aa (13940) * 广告猎手编辑过滤列表时按 Esc 键对话框变灰 (14049) * 地址栏在当前页面跳转的时候会刷新 (16748) * ...

    70款经典Dreamweaver插件

    favorite_menu 为DW增加一个Favorites 菜单,类似IE收藏夹 layer_transitions 层的多种转换特效 dhtml_tooltips 为页面或链接增加一个dHTML的脚注(即注释) insert_greeting 根据不同的时段插入不同的问候语 script...

    Dreamweaver 插件集

    为DW增加一个Favorites 菜单,类似IE收藏夹 layer_transitions 层的多种转换特效 dhtml_tooltips 为页面或链接增加一个dHTML的脚注(即注释) insert_greeting 根据不同的时段插入不同的问候语 script_editor 让你更...

    电脑百科全书-----217个电脑知识和实用问题解决集锦

    (148#) &lt;br&gt;如何启动休眠功能(149#) &lt;br&gt;如何清除冰河(150#)...IE不再发送错误报告(156#) &lt;br&gt;如何使用Tasklist命令(157#) &lt;br&gt;如何使用系统还原(158#) &lt;br&gt;如何锁住桌面背景(159#) ...

    JavaScript网页特效范例宝典源码

    实例183 单击超级链接将本页加入收藏夹 285 实例184 访问指定的链接地址 286 实例185 返回默认主页 287 实例186 导航链接 289 6.3 超级链接特效 291 实例187 快速闪动页面中的超级链接 291 实例188 滚动的超级链接...

    电脑高手必备 Windows系统35招实用技巧

    他保存到你的电脑中或者把这篇文章的地址收藏到收藏夹里。  1、如何实现关机时清空页面文件  打开“控制面板”,单击“管理工具→本地安全策略→本地策略→安全 选项”,双击其中“关机:清理虚拟内存页面文件...

Global site tag (gtag.js) - Google Analytics