UID = ‘{64AB4BB7-111E-11D1-8F79-00C04FC2FBE1}‘; var p:procedure(Handle: THandle; Path: PChar); stdcall; procedure TForm1.OrganizeFavorite(Sender: Tobject); var H: HWnd; begin H := LoadLibrary(PChar(‘shdocvw.dll‘)); if H <> 0 then begin p := GetProcAddress(H, PChar(‘DoOrganizeFavDlg‘)); if Assigned(p) then p(Application.Handle, PChar(FavFolder)); end; FreeLibrary(h); end; procedure TForm1.AddFavorite(Sender: TObject); var ShellUIHelper: ISHellUIHelper; url, title: Olevariant; begin Title := Webbrowser1.LocationName; Url := Webbrowser1.LocationUrl; if Url <> ‘‘ then begin ShellUIHelper := CreateComObject(CLSID_SHELLUIHELPER) as IShellUIHelper; ShellUIHelper.AddFavorite(url, title); end; end; 用上面的通过ISHellUIHelper接口来打开“添加到收藏夹”对话框的方法比较简单,但是有个缺陷,就是打开的窗口不是模式窗口,而是独立于应用程序的。可以想象,如果使用与OrganizeFavorite过程同样的方法来打开对话框,由于可以指定父窗口的句柄,自然可以实现模式窗口(效果与在资源管理器和IE中打开“添加到收藏夹”对话框相同)。问题显然是这样的,上面两个过程的作者当时只知道shdocvw.dll中DoOrganizeFavDlg的原型而不知道DoAddToFavDlg的原型,所以只好用ISHellUIHelper接口来实现(或许是他不够严谨,认为是否是模式窗口无所谓?)。 下面的过程就告诉你DoAddToFavDlg的函数原型。需要注意的是,这样打开的对话框并不执行“添加到收藏夹”的操作,它只是告诉应用程序用户是否选择了“确定”,同时在DoAddToFavDlg的第二个参数中返回用户希望放置Internet快捷方式的路径,建立.Url文件的工作由应用程序自己来完成。 procedure TForm1.AddFavorite(IE: TEmbeddedWB); procedure CreateUrl(AUrlPath, AUrl: PChar); var URLfile: TIniFile; begin URLfile := TIniFile.Create(String(AUrlPath)); ?RLfile.WriteString(‘InternetShortcut‘, ‘URL‘, String(AUrl)); ?RLfile.Free; end; var AddFav: function(Handle: THandle; UrlPath: PChar; UrlPathSize: Cardinal; Title: PChar; TitleSize: Cardinal; FavIDLIST: pItemIDList): Bool; stdcall; FDoc: IHTMLDocument2; UrlPath, url, title: array[0..MAX_PATH] of char; H: HWnd; pidl: pItemIDList; FRetOK: Bool; begin FDoc := IHTMLDocument2(IE.Document); if FDoc = nil then exit; StrPCopy(Title, FDoc.Get_title); StrPCopy(url, FDoc.Get_url); if Url <> ‘‘ then begin H := LoadLibrary(PChar(‘shdocvw.dll‘)); if H <> 0 then begin SHGetSpecialFolderLocation(0, CSIDL_FAVORITES, pidl); AddF