////////////////////////////////////////////////////////////////// // File : cfactory.cpp // Purpose : IClassFactory interface implement. // // // Copyright(c) 1995-1998, Microsoft Corp. All rights reserved. // ////////////////////////////////////////////////////////////////// #define INITGUID 1 #include #include #include "cfactory.h" #include "registry.h" #include "guids.h" #include "hwxapp.h" #include "imepad.h" #define MSAA #ifdef MSAA // used by lib(plv etc.) #include #endif ////////////////////////////////////////////////////////////////// // // static member variable declaration. // LONG CFactory::m_cServerLocks = 0; // Locked count LONG CFactory::m_cComponents = 0; // Locked count HMODULE CFactory::m_hModule = NULL ; // DLL module handle FACTARRAY CFactory::m_fData = { &CLSID_ImePadApplet_MultiBox, #ifndef UNDER_CE #ifdef FE_JAPANESE "MS-IME 2000 HandWriting Applet", #elif FE_KOREAN "MS Korean IME 6.1 HandWriting Applet", #else "MSIME98 HandWriting Applet", #endif "IMEPad.HWR", "IMEPad.HWR.6.1", #else // UNDER_CE #ifdef FE_JAPANESE TEXT("MS-IME 2000 HandWriting Applet"), #elif FE_KOREAN "MS Korean IME 6.1 HandWriting Applet", #else TEXT("MSIME98 HandWriting Applet"), #endif TEXT("IMEPad.HWR"), TEXT("IMEPad.HWR.8"), #endif // UNDER_CE }; ////////////////////////////////////////////////////////////////// // // static data definition ////////////////////////////////////////////////////////////////// // Function : CFactory::CFactory // Type : None // Purpose : Constructor // Args : None // Return : // DATE : Wed Mar 25 14:38:30 1998 ////////////////////////////////////////////////////////////////// CFactory::CFactory(VOID) : m_cRef(1) { } ////////////////////////////////////////////////////////////////// // Function : CFactory::~CFactory // Type : None // Purpose : Destructor // Args : None // Return : // DATE : Wed Mar 25 14:38:30 1998 ////////////////////////////////////////////////////////////////// CFactory::~CFactory(VOID) { } ////////////////////////////////////////////////////////////////// // // IUnknown implementation // ////////////////////////////////////////////////////////////////// // Function : CFactory::QueryInterface // Type : HRESULT __stdcall // Purpose : // Args : // : REFIID iid // : LPVOID *ppv; // Return : // DATE : Wed Mar 25 14:40:29 1998 ////////////////////////////////////////////////////////////////// HRESULT __stdcall CFactory::QueryInterface(REFIID iid, LPVOID * ppv) { IUnknown* pI ; if ((iid == IID_IUnknown) || (iid == IID_IClassFactory)) { pI= this ; } else { *ppv = NULL ; return E_NOINTERFACE ; } pI->AddRef() ; *ppv = pI ; return S_OK ; } ////////////////////////////////////////////////////////////////// // Function : CFactory::AddRef // Type : ULONG __stdcall // Purpose : // Args : None // Return : reference count // DATE : Wed Mar 25 15:40:07 1998 ////////////////////////////////////////////////////////////////// ULONG __stdcall CFactory::AddRef() { ::InterlockedIncrement(&m_cRef) ; return (ULONG)m_cRef; } ////////////////////////////////////////////////////////////////// // Function : CFactory::Release // Type : ULONG __stdcall // Purpose : // Args : None // Return : reference count // DATE : Wed Mar 25 15:40:41 1998 ////////////////////////////////////////////////////////////////// ULONG __stdcall CFactory::Release() { if(0 == ::InterlockedDecrement(&m_cRef)) { delete this; return 0; } return m_cRef ; } ////////////////////////////////////////////////////////////////// // // IClassFactory implementation // ////////////////////////////////////////////////////////////////// // Function : CFactory::CreateInstance // Type : HRESULT __stdcall // Purpose : // Args : // : IUnknown * pUnknownOuter // : REFIID riid // : LPVOID * ppv // Return : // DATE : Wed Mar 25 15:05:37 1998 ////////////////////////////////////////////////////////////////// HRESULT __stdcall CFactory::CreateInstance(IUnknown* pUnknownOuter, REFIID refiid, LPVOID *ppv) { // Create the component. HRESULT hr; if((pUnknownOuter != NULL) && (refiid != IID_IUnknown)) { return CLASS_E_NOAGGREGATION ; } CApplet *lpCApplet = new CApplet(m_hModule); if(!lpCApplet) { return E_OUTOFMEMORY; } hr = lpCApplet->QueryInterface(refiid, ppv); if(FAILED(hr)) { return hr; } lpCApplet->Release(); return hr; } ////////////////////////////////////////////////////////////////// // Function : CFactory::LockServer // Type : HRESULT __stdcall // Purpose : // Args : // : BOOL bLock // Return : // DATE : Wed Mar 25 15:13:41 1998 ////////////////////////////////////////////////////////////////// HRESULT __stdcall CFactory::LockServer(BOOL bLock) { if (bLock) { ::InterlockedIncrement(&m_cServerLocks) ; } else { ::InterlockedDecrement(&m_cServerLocks) ; } return S_OK ; } ////////////////////////////////////////////////////////////////// // Function : CFactory::GetClassObject // Type : HRESULT // Purpose : Called from exported API, DllGetClassObject() // Args : // : REFCLSID rclsid // : REFIID iid // : LPVOID * ppv // Return : // DATE : Wed Mar 25 15:37:50 1998 ////////////////////////////////////////////////////////////////// HRESULT CFactory::GetClassObject(REFCLSID rclsid, REFIID iid, LPVOID *ppv) { if((iid != IID_IUnknown) && (iid != IID_IClassFactory)) { return E_NOINTERFACE ; } if(rclsid == CLSID_ImePadApplet_MultiBox) { *ppv = (IUnknown *) new CFactory(); if(*ppv == NULL) { return E_OUTOFMEMORY ; } return NOERROR ; } return CLASS_E_CLASSNOTAVAILABLE ; } ////////////////////////////////////////////////////////////////// // Function : CFactory::RegisterServer // Type : HRESULT // Purpose : Called from exported API DllRegisterServer() // Args : None // Return : // DATE : Wed Mar 25 17:03:13 1998 ////////////////////////////////////////////////////////////////// HRESULT CFactory::RegisterServer(VOID) { // Get server location. Register(m_hModule, *m_fData.lpClsId, m_fData.lpstrRegistryName, m_fData.lpstrProgID, m_fData.lpstrVerIndProfID); RegisterCategory(TRUE, CATID_MSIME_IImePadApplet, CLSID_ImePadApplet_MultiBox); return S_OK ; } ////////////////////////////////////////////////////////////////// // Function : CFactory::UnregisterServer // Type : HRESULT // Purpose : Called from exported API, DllUnregisterServer() // Args : None // Return : // DATE : Wed Mar 25 17:02:01 1998 ////////////////////////////////////////////////////////////////// HRESULT CFactory::UnregisterServer(VOID) { RegisterCategory(FALSE, CATID_MSIME_IImePadApplet, CLSID_ImePadApplet_MultiBox); Unregister(*m_fData.lpClsId, m_fData.lpstrVerIndProfID, m_fData.lpstrProgID); return S_OK ; } ////////////////////////////////////////////////////////////////// // Function : CFactory::CanUnloadNow // Type : HRESULT // Purpose : Called from exported API, DllCanUnloadNow() // Args : None // Return : // DATE : Wed Mar 25 17:02:18 1998 ////////////////////////////////////////////////////////////////// HRESULT CFactory::CanUnloadNow() { if(IsLocked()) { return S_FALSE ; } else { return S_OK ; } }