.NET开发

本类阅读TOP10

·NHibernate快速指南(翻译)
·vs.net 2005中文版下载地址收藏
·【小技巧】一个判断session是否过期的小技巧
·VB/ASP 调用 SQL Server 的存储过程
·?dos下编译.net程序找不到csc.exe文件
·通过Web Services上传和下载文件
·学习笔记(补)《.NET框架程序设计(修订版)》--目录
·VB.NET实现DirectDraw9 (2) 动画
·VB.NET实现DirectDraw9 (1) 托管的DDraw
·建站框架规范书之——文件命名

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Internet Explorer 编程简述(三)“整理收藏夹”对话框

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

关于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




相关文章

相关软件