cedure 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);
AddFav := GetProcAddress(H, Pchar(''DoAddToFavDlg''));
if Assigned(AddFav) then
FRetOK :=AddFav(Handle, UrlPath, Sizeof(UrlPath), Title, Sizeof(Title), pidl)
end;
FreeLibrary(h);
if FRetOK then
CreateUrl(UrlPath, Url);
end
end;
-----------------------