Internet Explorer 编程简述(三)“整理收藏夹”对话框

关于Internet Explorer的收藏夹,比较常见的两个问题就是调用“整理收藏夹”对话框和“添加到收藏夹”对话框。调用的方法有多种,但其中还是有些值得讨论的地方。

 

关键字:添加到收藏夹,整理收藏夹,DoAddToFavDlg, DoOrganizeFavDlg

 

 

1、整理收藏夹

 

调用“整理收藏夹”对话框(如下),基本上来说都用的是同一个方法,即调用“shdocvw.dll”中的“DoOrganizeFavDlg”函数,把父窗口句柄和收藏夹路径作为参数传入即可。

 

 

2、代码

 

代码实例如下所示,值得注意的是对“shdocvw.dll”的处理,为避免重复调用,应该先检查其是否已经在内存中。

 

void CMyHtmlView::OnFavOrganizefav()
{
  typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR);

  bool bResult = false;

  HMODULE hMod = ::GetModuleHandle( _T("shdocvw.dll") );

  if (hMod == NULL)//如果"shdocvw.dll"尚未载入则载入之
  {
    hMod = ::LoadLibrary( _T("shdocvw.dll") );

    if (hMod == NULL)
    {
      MessageBox( _T("The dynamic link library ShDocVw.DLL cannot be found."),
        _T("Error"), MB_OK | MB_ICONSTOP );
      return;
    }
    LPFNORGFAV lpfnDoOrganizeFavDlg = (LPFNORGFAV)
      ::GetProcAddress( hMod, "DoOrganizeFavDlg" );

    if (lpfnDoOrganizeFavDlg == NULL)
    {
      MessageBox( _T("The entry point DoOrganizeFavDlg cannot be found/n")
        _T("in the dynamic link library ShDocVw.DLL."),
        _T("Error"), MB_OK | MB_ICONSTOP );
      return;
    }

    TCHAR szPath [ MAX_PATH ];
    HRESULT hr;

    hr = ::SHGetSpecialFolderPath( m_hWnd, szPath, CSIDL_FAVORITES, TRUE );
    if (FAILED(hr))
    {
      MessageBox( _T("The path of the Favorites folder cannot be found."),
        _T("Error"), MB_OK | MB_ICONSTOP );
      return;
    }

    bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false;

    ::FreeLibrary( hMod );
  }
  else
//如果"shdocvw.dll"已经在调用者进程的地址空间中则直接使用。
  {
    LPFNORGFAV lpfnDoOrganizeFavDlg = (LPFNORGFAV)
      ::GetProcAddress( hMod, "DoOrganizeFavDlg" );

    if (lpfnDoOrganizeFavDlg == NULL)
    {
      MessageBox( _T("The entry point DoOrganizeFavDlg cannot be found/n")
        _T("in the dynamic link library ShDocVw.DLL."),
        _T("Error"), MB_OK | MB_ICONSTOP );
      return;
    }

    TCHAR szPath [ MAX_PATH ];
    HRESULT hr;

    hr = ::SHGetSpecialFolderPath( m_hWnd, szPath, CSIDL_FAVORITES, TRUE );
    if (FAILED(hr))
    {
      MessageBox( _T("The path of the Favorites folder cannot be found."),
        _T("Error"), MB_OK | MB_ICONSTOP );
      return;
    }

    bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false;
  }

  return;

}


3、讨论

实际上,从“DoOrganizeFavDlg”函数的原型声明我们可以看到,由于需要一个路径,所以“整理收藏夹”对话框其实不仅可以用来整理收藏夹,还可以整理磁盘上的目录。而且所谓的整理也不过是提供了一个对话框使用户用起来比较方便而已,和直接在资源管理器中整理没有实质性的差别。因此调用“整理收藏夹”对话框的方法从IE4.0开始就没有变过,除了对话框的布局有所改变。

 

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

 

 

IE 4.0的“整理收藏夹”对话框

 

 

IE 4.0的“整理收藏夹”对话框(原先的设计)

 

 

“添加到收藏夹”就不同了,“DoAddToFavDlg”函数不再像“DoOrganizeFavDlg”函数一样对所有IE的版本都适用。

 

 

参考资料

MSDN: Adding Internet Explorer Favorites to Your Application

 

引用地址Internet Explorer 编程简述(三)“整理收藏夹”对话框

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值