windows-nt/Source/XPSP1/NT/com/mobile/syncmgr/sample/dllmain.cpp
2020-09-26 16:20:57 +08:00

254 lines
5.8 KiB
C++

//==========================================================================
//
// 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 1998 - 1999 Microsoft Corporation. All Rights Reserved.
//
//--------------------------------------------------------------------------
#include "precomp.h"
// if writing own handler need to change CLSID value in guid.h
EXTERN_C const GUID CLSID_SyncMgrHandler;
TCHAR szCLSIDDescription[] = TEXT("Sample Synchronization Manager Handler");
WCHAR wszCLSIDDescription[] = L"Sample Synchronization Handler Handler";
//
// Global variables
//
UINT g_cRefThisDll = 0; // Reference count of this DLL.
HINSTANCE g_hmodThisDll = NULL; // Handle to this DLL itself.
CSettings *g_pSettings = NULL; // ptr to global settings class.
//+---------------------------------------------------------------------------
//
// Function: DllMain, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
//----------------------------------------------------------------------------
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
// Extension DLL one-time initialization
g_hmodThisDll = hInstance;
g_pSettings = new CSettings;
if (NULL == g_pSettings)
{
return FALSE;
}
//initialize the common controls for property sheets
INITCOMMONCONTROLSEX controlsEx;
controlsEx.dwSize = sizeof(INITCOMMONCONTROLSEX);
controlsEx.dwICC = ICC_USEREX_CLASSES | ICC_WIN95_CLASSES;
InitCommonControlsEx(&controlsEx);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
DWORD cRefs;
CSettings *pSettings = g_pSettings; // ptr to global settings class.
g_pSettings = NULL;
Assert(0 == g_cRefThisDll);
if (pSettings)
{
cRefs = pSettings->Release();
Assert(0 == cRefs);
}
}
return TRUE;
}
//+---------------------------------------------------------------------------
//
// Function: DllRegisterServer, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
//----------------------------------------------------------------------------
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_SyncMgrHandler, szID, GUID_SIZE);
#else
BOOL fUsedDefaultChar;
StringFromGUID2(CLSID_SyncMgrHandler, 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"));
// register with SyncMgr
LPSYNCMGRREGISTER lpSyncMgrRegister;
hr = CoCreateInstance(CLSID_SyncMgr,NULL,CLSCTX_SERVER,IID_ISyncMgrRegister,
(LPVOID *) &lpSyncMgrRegister);
if (SUCCEEDED(hr))
{
hr = lpSyncMgrRegister->RegisterSyncMgrHandler(CLSID_SyncMgrHandler,
wszCLSIDDescription,0 /* dwSyncMgrRegisterFlags */);
AssertSz(SUCCEEDED(hr),"Registration Failed");
lpSyncMgrRegister->Release();
}
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: DllUnregisterServer, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
//----------------------------------------------------------------------------
STDAPI DllUnregisterServer(void)
{
HRESULT hr;
// UnRegister with SyncMgr
LPSYNCMGRREGISTER lpSyncMgrRegister;
hr = CoCreateInstance(CLSID_SyncMgr,NULL,CLSCTX_SERVER,IID_ISyncMgrRegister,
(LPVOID *) &lpSyncMgrRegister);
if (SUCCEEDED(hr))
{
hr = lpSyncMgrRegister->UnregisterSyncMgrHandler(CLSID_SyncMgrHandler,0);
lpSyncMgrRegister->Release();
}
return hr;
}
//+---------------------------------------------------------------------------
//
// Function: DllCanUnloadNow, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
//----------------------------------------------------------------------------
STDAPI DllCanUnloadNow(void)
{
return (g_cRefThisDll == 0) ? S_OK : S_FALSE;
}
//+---------------------------------------------------------------------------
//
// Function: DllGetClassObject, public
//
// Synopsis:
//
// Arguments:
//
// Returns:
//
// Modifies:
//
//----------------------------------------------------------------------------
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
*ppvOut = NULL;
if (IsEqualIID(rclsid, CLSID_SyncMgrHandler))
{
CClassFactory *pcf = new CClassFactory;
return pcf->QueryInterface(riid, ppvOut);
}
return CLASS_E_CLASSNOTAVAILABLE;
}