220 lines
5.3 KiB
C++
220 lines
5.3 KiB
C++
//+---------------------------------------------------------------------
|
|
//
|
|
// File: srfact.cxx
|
|
//
|
|
// Contents: Class Factory
|
|
//
|
|
// Classes: SRFactory
|
|
//
|
|
//------------------------------------------------------------------------
|
|
|
|
//#pragma warning(disable:4103)
|
|
#include <stdlib.h>
|
|
|
|
#include <windows.h>
|
|
#include <windowsx.h>
|
|
#include <commdlg.h> // common dialog boxes
|
|
|
|
#include <ole2.h>
|
|
#include <o2base.hxx> // the base classes and utilities
|
|
|
|
#include <initguid.h>
|
|
#include "srs.hxx"
|
|
|
|
SRFactory * gpSRFactory = NULL;
|
|
DWORD gdwRegisterClass = 0;
|
|
|
|
extern "C" BOOL
|
|
CreateSRClassFactory(HINSTANCE hinst,BOOL fEmbedded)
|
|
{
|
|
BOOL fRet = FALSE;
|
|
if(SRFactory::Create(hinst))
|
|
{
|
|
gpSRFactory->AddRef();
|
|
if(fEmbedded)
|
|
{
|
|
DOUT(TEXT("SoundRec: Registering SRFactory\r\n"));
|
|
|
|
HRESULT hr = CoRegisterClassObject(CLSID_SOUNDREC,
|
|
(LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory,
|
|
CLSCTX_LOCAL_SERVER,
|
|
//REGCLS_MULTI_SEPARATE,
|
|
REGCLS_SINGLEUSE,
|
|
&gdwRegisterClass);
|
|
if(OK(hr))
|
|
{
|
|
CoLockObjectExternal((LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory,
|
|
TRUE, TRUE);
|
|
fRet = TRUE;
|
|
}
|
|
#if DBG
|
|
else
|
|
{
|
|
TCHAR achBuffer[256];
|
|
wsprintf(achBuffer,
|
|
TEXT("SoundRec: CoRegisterClassObject (%lx)\r\n"),
|
|
(long)hr);
|
|
OutputDebugString(achBuffer);
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
fRet = TRUE;
|
|
}
|
|
}
|
|
|
|
return fRet;
|
|
}
|
|
|
|
extern "C" HRESULT
|
|
ReleaseSRClassFactory(void)
|
|
{
|
|
HRESULT hr = NOERROR;
|
|
if(gdwRegisterClass)
|
|
{
|
|
#if DBG
|
|
OutputDebugString(TEXT("SoundRec: Revoking SRFactory\r\n"));
|
|
#endif
|
|
CoLockObjectExternal((LPUNKNOWN)(LPCLASSFACTORY)gpSRFactory,
|
|
FALSE, TRUE);
|
|
hr = CoRevokeClassObject(gdwRegisterClass);
|
|
gdwRegisterClass = 0;
|
|
|
|
gpSRFactory->Release();
|
|
gpSRFactory = NULL;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
BOOL
|
|
SRFactory::Create(HINSTANCE hinst)
|
|
{
|
|
gpSRFactory = new SRFactory;
|
|
//
|
|
// initialize our classes
|
|
//
|
|
if (gpSRFactory == NULL
|
|
|| !gpSRFactory->Init(hinst)
|
|
|| !SRCtrl::ClassInit(gpSRFactory->_pClass)
|
|
|| !SRDV::ClassInit(gpSRFactory->_pClass)
|
|
|| !SRInPlace::ClassInit(gpSRFactory->_pClass))
|
|
{
|
|
return FALSE;
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SRFactory:::Init
|
|
//
|
|
// Synopsis: Initializes the class factory
|
|
//
|
|
// Arguments: [hinst] -- instance handle of the module with
|
|
// class descriptor resources
|
|
//
|
|
// Returns: TRUE iff the factory was successfully initialized
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
BOOL
|
|
SRFactory::Init(HINSTANCE hinst)
|
|
{
|
|
//
|
|
// Register the standard OLE clipboard formats.
|
|
// These are available in the OleClipFormat array.
|
|
//
|
|
RegisterOleClipFormats();
|
|
|
|
if((_pClass = new ClassDescriptor) == NULL)
|
|
return FALSE;
|
|
|
|
BOOL fRet = _pClass->Init(hinst, 0); //IDS_CLASSID);
|
|
|
|
//
|
|
// Patch _pClass->_haccel with a resource reload
|
|
// (for InPlace) due to mismatch between the base class
|
|
// resource scheme and legacy code...
|
|
//
|
|
if(fRet)
|
|
{
|
|
if((_pClass->_haccel = LoadAccelerators(hinst, TEXT("SOUNDREC"))) == NULL)
|
|
fRet = FALSE;
|
|
}
|
|
return fRet;
|
|
|
|
}
|
|
|
|
STDMETHODIMP
|
|
SRFactory::LockServer(BOOL fLock)
|
|
{
|
|
return CoLockObjectExternal((LPUNKNOWN)gpSRFactory, fLock, TRUE);
|
|
}
|
|
|
|
//+---------------------------------------------------------------
|
|
//
|
|
// Member: SRFactory:::CreateInstance
|
|
//
|
|
// Synopsis: Member of IClassFactory interface
|
|
//
|
|
//----------------------------------------------------------------
|
|
|
|
STDMETHODIMP
|
|
SRFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID iid, LPVOID FAR* ppv)
|
|
{
|
|
#if DBG
|
|
OutputDebugString(TEXT("SRFactory::CreateInstance\r\n"));
|
|
#endif
|
|
|
|
*ppv = NULL; //NULL output param
|
|
//
|
|
// create an object, then query for the appropriate interface
|
|
//
|
|
LPUNKNOWN pUnk;
|
|
LPSRCTRL pTemp;
|
|
HRESULT hr;
|
|
if (OK(hr = SRCtrl::Create(pUnkOuter, _pClass, &pUnk, &pTemp)))
|
|
{
|
|
hr = pUnk->QueryInterface(iid, ppv);
|
|
pUnk->Release(); // on failure this will release obj, otherwise
|
|
// it will ensure an object ref count of 1
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
|
|
/*
|
|
* for the creation of a moniker
|
|
*/
|
|
BOOL
|
|
CreateStandaloneObject(void)
|
|
{
|
|
DOUT(TEXT("Soundrec CreateStandaloneObject\r\n"));
|
|
|
|
//
|
|
//Ensure a unique filename in gachLinkFilename so we can create valid
|
|
//FileMonikers...
|
|
//
|
|
if(gachLinkFilename[0] == 0)
|
|
BuildUniqueLinkName();
|
|
|
|
BOOL fSuccess = FALSE;
|
|
LPVOID pvUnk;
|
|
HRESULT hr = gpSRFactory->CreateInstance(NULL, IID_IUnknown, (LPVOID FAR*)&pvUnk);
|
|
if(hr == NOERROR)
|
|
{
|
|
//CoLockObjectExternal((LPUNKNOWN)(LPOLEOBJECT)gpCtrlThis, TRUE, TRUE);
|
|
extern LPSRCTRL gpCtrlThis;
|
|
gpCtrlThis->Lock();
|
|
fSuccess = TRUE;
|
|
}
|
|
else
|
|
{
|
|
DOUT(TEXT("Soundrec CreateStandaloneObject FAILED!\r\n"));
|
|
fSuccess = FALSE;
|
|
}
|
|
return fSuccess;
|
|
}
|