關於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 編程簡述(三)“整理收藏夾”對話方塊