Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

303 lines
6.7 KiB

// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
// PARTICULAR PURPOSE.
//
// Copyright (C) 1993-1996 Microsoft Corporation. All Rights Reserved.
//
// MODULE: shellext.cpp
//
// Purpose: Implements the class factory code as well as COneStopHandler::QI,
// COneStopHandler::AddRef and COneStopHandler::Release code.
#include <objbase.h>
#include "SyncHndl.h"
#include "reg.h"
// vars and functions specific implementations must override.
EXTERN_C const GUID CLSID_OneStopHandler;
extern TCHAR szCLSIDDescription[];
extern COneStopHandler* CreateHandlerObject();
extern void DestroyHandlerObject(COneStopHandler* pOfflineSynchronize);
//
// Global variables
//
UINT g_cRefThisDll = 0; // Reference count of this DLL.
HINSTANCE g_hmodThisDll = NULL; // Handle to this DLL itself.
/////////////////////////////////////////////////////////////////////////////
// DllRegisterServer - Adds entries to the system registry
STDAPI DllRegisterServer(void)
{
HRESULT hr = NOERROR;
#ifndef _UNICODE
WCHAR wszID[GUID_SIZE+1];
#endif // !_UNICODE
TCHAR szID[GUID_SIZE+1];
TCHAR szCLSID[GUID_SIZE+1];
TCHAR szModulePath[MAX_PATH];
// Obtain the path to this module's executable file for later use.
GetModuleFileName(
g_hmodThisDll,
szModulePath,
sizeof(szModulePath)/sizeof(TCHAR));
/*-------------------------------------------------------------------------
Create registry entries for the DllSndBall Component.
-------------------------------------------------------------------------*/
// Create some base key strings.
#ifdef _UNICODE
StringFromGUID2(CLSID_OneStopHandler, szID, GUID_SIZE);
#else
BOOL fUsedDefaultChar;
StringFromGUID2(CLSID_OneStopHandler, wszID, GUID_SIZE);
WideCharToMultiByte(CP_ACP ,0,
wszID,-1,szID,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
#endif // _UNICODE
lstrcpy(szCLSID, TEXT("CLSID\\"));
lstrcat(szCLSID, szID);
// Create entries under CLSID.
SetRegKeyValue(HKEY_CLASSES_ROOT,
szCLSID,
NULL,
szCLSIDDescription);
SetRegKeyValue(HKEY_CLASSES_ROOT,
szCLSID,
TEXT("InProcServer32"),
szModulePath);
AddRegNamedValue(
szCLSID,
TEXT("InProcServer32"),
TEXT("ThreadingModel"),
TEXT("Apartment"));
#define ONESTOPKEY TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\SyncMgr\\Handlers")
// Register with OneStop
SetRegKeyValue(HKEY_LOCAL_MACHINE,
ONESTOPKEY,
NULL,
TEXT("OneStop Reg Key") );
SetRegKeyValue(HKEY_LOCAL_MACHINE,
ONESTOPKEY,
szID,
szCLSIDDescription);
return hr;
}
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
ODS("In DLLMain, DLL_PROCESS_ATTACH\r\n");
// Extension DLL one-time initialization
g_hmodThisDll = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
ODS("In DLLMain, DLL_PROCESS_DETACH\r\n");
}
return 1; // ok
}
//---------------------------------------------------------------------------
// DllCanUnloadNow
//---------------------------------------------------------------------------
STDAPI DllCanUnloadNow(void)
{
ODS("In DLLCanUnloadNow\r\n");
return (g_cRefThisDll == 0 ? S_OK : S_FALSE);
}
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
ODS("In DllGetClassObject\r\n");
*ppvOut = NULL;
if (IsEqualIID(rclsid, CLSID_OneStopHandler))
{
CClassFactory *pcf = new CClassFactory;
return pcf->QueryInterface(riid, ppvOut);
}
return CLASS_E_CLASSNOTAVAILABLE;
}
CClassFactory::CClassFactory()
{
ODS("CClassFactory::CClassFactory()\r\n");
m_cRef = 0L;
g_cRefThisDll++;
}
CClassFactory::~CClassFactory()
{
g_cRefThisDll--;
}
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid,
LPVOID FAR *ppv)
{
ODS("CClassFactory::QueryInterface()\r\n");
*ppv = NULL;
// Any interface on this object is the object pointer
if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
{
*ppv = (LPCLASSFACTORY)this;
AddRef();
return NOERROR;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
return ++m_cRef;
}
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
if (--m_cRef)
return m_cRef;
delete this;
return 0L;
}
STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
REFIID riid,
LPVOID *ppvObj)
{
HRESULT hr = NOERROR;
*ppvObj = NULL;
ODS("CClassFactory::CreateInstance()\r\n");
// Shell extensions typically don't support aggregation (inheritance)
if (pUnkOuter)
return CLASS_E_NOAGGREGATION;
// Create the main shell extension object. The shell will then call
// QueryInterface with IID_IShellExtInit--this is how shell extensions are
// initialized.
LPSYNCMGRSYNCHRONIZE pOneStopHandler = CreateHandlerObject(); //Create the COneStopHandler object
if (NULL == pOneStopHandler)
return E_OUTOFMEMORY;
hr = pOneStopHandler->QueryInterface(riid, ppvObj);
pOneStopHandler->Release(); // remove our reference.
return hr;
}
STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
{
return NOERROR;
}
// *********************** COneStopHandler *************************
COneStopHandler::COneStopHandler()
{
ODS("COneStopHandler::COneStopHandler()\r\n");
m_cRef = 1;
m_pOfflineHandlerItems = NULL;
m_pOfflineSynchronizeCallback = NULL;
g_cRefThisDll++;
}
COneStopHandler::~COneStopHandler()
{
// TODO: ADD ASSERTS THAT MEMBERS HAVE BEEN RELEASED.
g_cRefThisDll--;
}
STDMETHODIMP COneStopHandler::QueryInterface(REFIID riid, LPVOID FAR *ppv)
{
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
{
ODS("COneStopHandler::QueryInterface()==>IID_IUknown\r\n");
*ppv = (LPUNKNOWN)this;
}
else if (IsEqualIID(riid, IID_ISyncMgrSynchronize))
{
ODS("COneStopHandler::QueryInterface()==>IID_IOfflineSynchronize\r\n");
*ppv = (LPSYNCMGRSYNCHRONIZE)this;
}
if (*ppv)
{
AddRef();
return NOERROR;
}
ODS("COneStopHandler::QueryInterface()==>Unknown Interface!\r\n");
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) COneStopHandler::AddRef()
{
ODS("COneStopHandler::AddRef()\r\n");
return ++m_cRef;
}
STDMETHODIMP_(ULONG) COneStopHandler::Release()
{
ODS("COneStopHandler::Release()\r\n");
if (--m_cRef)
return m_cRef;
DestroyHandler();
return 0L;
}