210 lines
4.4 KiB
C++
210 lines
4.4 KiB
C++
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
|
||
|
|