转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 站长学院 >> Web开发 >> 正文
Internet Explorer 编程简述(四)“添加到收藏夹”对话框         ★★★★

Internet Explorer 编程简述(四)“添加到收藏夹”对话框

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1353 更新时间:2009/4/23 10:51:11

关键字:“添加到收藏夹”对话框, 模态窗口,IShellUIHelper,DoAddToFavDlg, DoOrganizeFavDlg

1、概述

调用“添加到收藏夹”对话框(如下)与调用“整理收藏夹”对话框有不同之处,前者所做的工作比后者要来得复杂。将链接添加到收藏夹除了将链接保存之外,还可能会有脱机访问的设置,从IE 4.0到IE 5.0,处理的方式也发生了一些变化。

 


2、IShellUIHelper接口

微软专门提供了一个接口IShellUIHelper来实现对Windows Shell API一些功能的访问,将链接添加到收藏夹也是其中之一,就是下面的AddFavorite函数。

HRESULT IShellUIHelper::AddFavorite(BSTR URL, VARIANT *Title);

实例代码如下:

void CMyHtmlView::OnAddToFavorites()
{
  IShellUIHelper* pShellUIHelper;
  HRESULT hr = CoCreateInstance(CLSID_ShellUIHelper, NULL,
    CLSCTX_INPROC_SERVER, IID_IShellUIHelper,(LPVOID*)&pShellUIHelper);

  if (SUCCEEDED(hr))
  {
    _variant_t vtTitle(GetTitle().AllocSysString());
    CString strURL = m_webBrowser.GetLocationURL();

    pShellUIHelper->AddFavorite(strURL.AllocSysString(), &vtTitle);
    pShellUIHelper->Release();
  }
}

我们注意到这里的“AddFavorite”函数并没有像“DoOrganizeFavDlg”那样需要一个父窗口句柄。这也导致与在IE中打开不同,通过IShellUIHelper接口显示出来的“添加到收藏夹”对话框是“非模态”的,有一个独立于我们应用程序的任务栏按钮,这使我们的浏览器显得非常不专业(我是个追求完美的人,这也是我的浏览器迟迟不能发布的原因之一)。
于是我们很自然地想到“shdocvw.dll”中除了“DoOrganizeFavDlg”外,应该还有一个类似的函数,可以传入一个父窗口句柄用以显示模态窗口,也许就像这样:

typedef UINT (CALLBACK* LPFNADDFAV)(HWND, LPTSTR, LPTSTR);

事实上,这样的函数确实存在于“shdocvw.dll”中,那就是“DoAddToFavDlg”。


3、DoAddToFavDlg函数

“DoAddToFavDlg”函数也是“shdocvw.dll”暴露出来的函数之一,其原型如下:

typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT,LPITEMIDLIST);

第一个参数正是我们想要的父窗口句柄,第二和第四个参数分别是初始目录(一般来说就是收藏夹目录)和要添加的链接的名字(比如网页的Title),第三和第五个参数分别是第二和第四两个缓冲区的长度,而最后一个参数则是指向与第二个参数目录相关的item identifier list的指针(PIDL)。但最奇怪的是这里并没有像“AddFavorite”函数一样的链接URL,那链接是怎样添加的呢?答案是“手动创建”。
第二个参数在函数调用返回后会包含用户在“添加到收藏夹”对话框中选择或创建的完整链接路径名(如“X:\XXX\mylink.url”),我们就根据这个路径和网页的URL来创建链接,代码如下(为简化,此处省去检查"shdocvw.dll"是否已在内存中的代码,参见《Internet Explorer 编程简述(三)“整理收藏夹”对话框》):

void CMyHtmlView::OnFavAddtofav()
{
  typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT,LPITEMIDLIST);

  HMODULE hMod = (HMODULE)LoadLibrary("shdocvw.dll");
  if (hMod)
  {
    LPFNADDFAV lpfnDoAddToFavDlg = (LPFNADDFAV)GetProcAddress( hMod, "DoAddToFavDlg");
    if (lpfnDoAddToFavDlg)
    {
      TCHAR szPath[MAX_PATH];
      LPITEMIDLIST pidlFavorites;

      if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_FAVORITES, TRUE) &&
         (SUCCEEDED(SHGetSpecialFolderLocation(NULL, CSIDL_FAVORITES, &pidlFavorites))))
      {
        TCHAR szTitle[MAX_PATH];
        strcpy(szTitle, GetLocationName());

        TCHAR szURL[MAX_PATH];
        strcpy(szURL, GetLocationURL());

        BOOL bOK = lpfnDoAddToFavDlg(m_hWnd, szPath,
             sizeof(szPath)/sizeof(szPath[0]), szTitle,
             sizeof(szTitle)/sizeof(szTitle[0]), pidlFavorites);
        CoTaskMemFree(pidlFavorites);

        if (bOK)
          CreateInternetShortcut( szURL, szPath, "");  //创建Internet快捷方式
      }
    }
    FreeLibrary(hMod);
  }
  return;
}

实现CreateInternetShortcut函数创建Internet快捷方式,可以用读写INI文件的方法,但更好的则是利用IUniformResourceLocator接口。

HRESULT CMyHtmlView::CreateInternetShortcut(LPCSTR pszURL, LPCSTR pszURLfilename,
  LPCSTR szDescription,LPCTSTR szIconFile,int nIndex)
{
  HRESULT hres;

  CoInitialize(NULL);

  IUniformResourceLocator *pHook;

  hres = CoCreateInstance (CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER,
    IID_IUniformResourceLocator, (void **)&pHook);

  if (SUCCEEDED (hres))
  {
    IPersistFile *ppf;
    IShellLink *psl;

  // Query IShellLink for the IPersistFile interface for
  hres = pHook->QueryInterface (IID_IPersistFile, (void **)&ppf);
  hres = pHook->QueryInterface (IID_IShellLink, (void **)&psl);

  if (SUCCEEDED (hres))
  {
    WORD wsz [MAX_PATH]; // buffer for Unicode string

  // Set the path to the shortcut target.
  pHook->SetURL(pszURL,0);

  hres = psl->SetIconLocation(szIconFile,nIndex);

  if (SUCCEEDED (hres))
  {
    // Set the description of the shortcut.
    hres = psl->SetDescription (szDescription);

  if (SUCCEEDED (hres))
  {
    // Ensure that the string consists of ANSI characters.
    MultiByteToWideChar (CP_ACP, 0, pszURLfilename, -1, wsz, MAX_PATH);

  // Save the shortcut via the IPersistFile::Save member function.
  hres = ppf->Save (wsz, TRUE);
  }
  }

  // Release the pointer to IPersistFile.
  ppf->Release ();
  psl->Release ();
  }

  // Release the pointer to IShellLink.
  pHook->Release ();

  }
  return hres;
}

好,上面的方法虽然麻烦一点,但总算解决了“模态窗口”的问题,使得我们的程序不至于让用户鄙视。但是问题又来了,我们发现“允许脱机使用”是Disabled的,那“自定义”也就无从谈起了,尽管90%的人都没有使用过IE提供的脱机浏览。

难道我们的希望要破灭吗?我们一方面想像调用“AddFavorite”函数一样的不必手动创建链接,一方面又要模态显示窗口,就像IE那样,还能自定义脱机浏览。

3、脚本方式

许多网页上都会有一个按钮或链接“添加本页到收藏夹”,实际上通过下面的脚本显示模态的“添加到收藏夹”对话框将网页加入到收藏夹。

window.external.AddFavorite(location.href, document.title);

这里的external对象是WebBrowser内置的COM自动化对象,以实现对文档对象模型(DOM)的扩展(我们也可以通过IDocHostUIHandler实现自己的扩展).查阅MSDN可以得知external对象的的方法与IShellUIHelper接口提供的方法是一样的。我们有理由相信,IShellUIHelper提供了对WebBrowser内置的external对象的访问,如果在适当的地方创建IShellUIHelper接口的实例,也许调用“AddFavorite”函数显示出来的就是模态对话框了。问题是我们还没有找到这样的地方。

从上面的脚本,我们很自然地又想到另一个方法。如果能够让网页来执行上面的脚本,岂不是问题就解决了?说做就做,如下:

void CMyHtmlView::OnFavAddtofav()
{
  CString strUrl = GetLocationURL();
  CString strTitle = GetLocationName();
  CString strjs = "javascri

[1] [2]  下一页


[聊天工具]用Windows98第二版直接共享Internet  [系统软件]Internet Explorer 编程简述(繁体版)
[系统软件]单击链接后无法打开新的 Internet Explorer 窗口或…  [系统软件]delphi2005帮助系统使用了microsoft document exp…
[系统软件]对Internet Explorer Web 控件做一点修改  [系统软件]OLE with the internet explorer
[系统软件]打造个性化的Internet Explorer  [系统软件]3dMax导出.x文件以及3D Explorer
[常用软件]微软Internet Explorer 8最新动向  [常用软件]PDF全能管家——PDFExplorer
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · Web开发  · 网页制作
    · 平面设计  · 网站运营
    · 网站推广  · 搜索优化
    · 建站心得  · 站长故事
    · 互联动态
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台