/*++ Copyright (c) 1997 Microsoft Corporation Module Name: DfsShell.cpp Abstract: This is the implementation file for Dfs Shell Extension object which implements IShellIExtInit and IShellPropSheetExt. Author: Constancio Fernandes (ferns@qspl.stpp.soft.net) 12-Jan-1998 Environment: NT only. */ #include "stdafx.h" #include "DfsShlEx.h" #include "DfsShell.h" /*---------------------------------------------------------------------- IShellExtInit Implementation. ------------------------------------------------------------------------*/ STDMETHODIMP CDfsShell::Initialize ( IN LPCITEMIDLIST pidlFolder, // Points to an ITEMIDLIST structure IN LPDATAOBJECT lpdobj, // Points to an IDataObject interface IN HKEY hkeyProgID // Registry key for the file object or folder type ) { /*++ Routine Description: Called by Shell when our extension is loaded. --*/ STGMEDIUM medium; FORMATETC fe = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; // Fail the call if lpdobj is NULL. if (lpdobj == NULL) { return E_FAIL; } // Render the data referenced by the IDataObject pointer to an HGLOBAL // storage medium in CF_HDROP format. HRESULT hr = lpdobj->GetData (&fe, &medium); if (FAILED (hr)) { return hr; } // If only one item is selected, retrieve the item name and store it in // m_lpszFile. Otherwise fail the call. if (DragQueryFile ((HDROP) medium.hGlobal, 0xFFFFFFFF, NULL, 0) == 1) { if (m_lpszFile) delete [] m_lpszFile; UINT uiChars = DragQueryFile ((HDROP) medium.hGlobal, 0, NULL, 0); m_lpszFile = new TCHAR [uiChars + 1]; if (!m_lpszFile) { hr = E_OUTOFMEMORY; } else { ZeroMemory(m_lpszFile, sizeof(TCHAR) * (uiChars + 1)); DragQueryFile ((HDROP) medium.hGlobal, 0, m_lpszFile, uiChars + 1); } } else { hr = E_FAIL; } ReleaseStgMedium (&medium); if (FAILED(hr)) return hr; // Display hour glass. CWaitCursor WaitCursor; if (IsDfsPath(m_lpszFile, &m_lpszEntryPath, &m_ppDfsAlternates)) { return S_OK; } else { if (NULL != m_lpszFile) { delete [] m_lpszFile; m_lpszFile = NULL; } return E_FAIL; } } STDMETHODIMP CDfsShell::AddPages ( IN LPFNADDPROPSHEETPAGE lpfnAddPage, IN LPARAM lParam ) /*++ Routine Description: Called by the shell just before the property sheet is displayed. Arguments: lpfnAddPage - Pointer to the Shell's AddPage function lParam - Passed as second parameter to lpfnAddPage Return value: NOERROR in all cases. If for some reason our pages don't get added, the Shell still needs to bring up the Properties' sheet. --*/ { BOOL bAddPage = TRUE; // check policy LONG lErr = ERROR_SUCCESS; HKEY hKey = 0; lErr = RegOpenKeyEx( HKEY_CURRENT_USER, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\explorer"), 0, KEY_QUERY_VALUE, &hKey); if (ERROR_SUCCESS == lErr) { lErr = RegQueryValueEx(hKey, _T("NoDFSTab"), 0, NULL, NULL, NULL); if (ERROR_SUCCESS == lErr) bAddPage = FALSE; // data exist, do not add the Dfs tab RegCloseKey(hKey); } if (!bAddPage) return NOERROR; // Create the page for the replica set. // Pass it to the Callback HPROPSHEETPAGE h_proppage = m_psDfsShellExtProp.Create(); if (!h_proppage) return E_OUTOFMEMORY; if (lpfnAddPage(h_proppage, lParam)) { m_psDfsShellExtProp.put_DfsShellPtr((IShellPropSheetExt *)this); CComBSTR bstrDirPath = m_lpszFile; CComBSTR bstrEntryPath = m_lpszEntryPath; m_psDfsShellExtProp.put_DirPaths(bstrDirPath, bstrEntryPath); } else { // must call this function for pages that have not been added. DestroyPropertySheetPage(h_proppage); } return S_OK; } STDMETHODIMP CDfsShell::ReplacePage ( IN UINT uPageID, IN LPFNADDPROPSHEETPAGE lpfnReplaceWith, IN LPARAM lParam ) /*++ Routine Description: Called by the shell only for Control Panel property sheet extensions Arguments: uPageID - ID of page to be replaced lpfnReplaceWith - Pointer to the Shell's Replace function lParam - Passed as second parameter to lpfnReplaceWith Return value: E_FAIL, since we don't support this function. --*/ { return E_FAIL; }