/*========================================================================== * * Copyright (C) 1999 Microsoft Corporation. All Rights Reserved. * * File: unk.cpp * Content: IUnknown implementation * History: * Date By Reason * ==== == ====== * 10/27/99 rodtoll Created (Modified from dxvoice project) * 12/16/99 rodtoll Bug #123250 - Insert proper names/descriptions for codecs * Codec names now based on resource entries for format and * names are constructed using ACM names + bitrate * 03/03/2000 rodtoll Updated to handle alternative gamevoice build. * 04/11/00 rodtoll Added code for redirection for custom builds if registry bit is set * 04/21/2000 rodtoll Bug #32889 - Does not run on Win2k on non-admin account * 06/09/00 rmt Updates to split CLSID and allow whistler compat and support external create funcs * 08/23/2000 rodtoll DllCanUnloadNow always returning TRUE! * 08/28/2000 masonb Voice Merge: Removed dvosal.h * 06/27/2001 rodtoll RC2: DPVOICE: DPVACM's DllMain calls into acm -- potential hang * Move global initialization to first object creation * ***************************************************************************/ #include "dpvacmpch.h" #define EXP __declspec(dllexport) LPVOID dvcpvACMInterface[] = { (LPVOID)CDPVCPI::QueryInterface, (LPVOID)CDPVCPI::AddRef, (LPVOID)CDPVCPI::Release, (LPVOID)CDPVCPI::EnumCompressionTypes, (LPVOID)CDPVCPI::IsCompressionSupported, (LPVOID)CDPVCPI::I_CreateCompressor, (LPVOID)CDPVCPI::I_CreateDeCompressor, (LPVOID)CDPVCPI::GetCompressionInfo }; LPVOID dvconvACMInterface[] = { (LPVOID)CDPVACMConv::I_QueryInterface, (LPVOID)CDPVACMConv::I_AddRef, (LPVOID)CDPVACMConv::I_Release, (LPVOID)CDPVACMConv::I_InitDeCompress, (LPVOID)CDPVACMConv::I_InitCompress, (LPVOID)CDPVACMConv::I_IsValid, (LPVOID)CDPVACMConv::I_GetUnCompressedFrameSize, (LPVOID)CDPVACMConv::I_GetCompressedFrameSize, (LPVOID)CDPVACMConv::I_GetNumFramesPerBuffer, (LPVOID)CDPVACMConv::I_Convert }; #undef DPF_MODNAME #define DPF_MODNAME "DoCreateInstance" // these two functions are required by the generic class factory file extern "C" HRESULT DoCreateInstance(LPCLASSFACTORY This, LPUNKNOWN pUnkOuter, REFCLSID rclsid, REFIID riid, LPVOID *ppvObj) { HRESULT hr; if( ppvObj == NULL || !DNVALID_WRITEPTR( ppvObj, sizeof(LPVOID) ) ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Invalid pointer passed for object" ); return DVERR_INVALIDPOINTER; } if( pUnkOuter != NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Object does not support aggregation" ); return CLASS_E_NOAGGREGATION; } if( IsEqualGUID(riid,IID_IDPVCompressionProvider) ) { PDPVCPIOBJECT pObject; pObject = new DPVCPIOBJECT; if( pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); return DVERR_OUTOFMEMORY; } pObject->pObject = new CDPVACMI; if( pObject->pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject; return DVERR_OUTOFMEMORY; } if (!pObject->pObject->InitClass()) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject->pObject; delete pObject; return DVERR_OUTOFMEMORY; } pObject->lpvVtble = &dvcpvACMInterface; hr = CDPVACMI::QueryInterface( pObject, riid, ppvObj ); if (FAILED(hr)) { DPFX(DPFPREP, DVF_ERRORLEVEL, "QI failed" ); delete pObject->pObject; delete pObject; } } else if( IsEqualGUID(riid,IID_IDPVConverter) ) { PDPVACMCONVOBJECT pObject; pObject = new DPVACMCONVOBJECT; if( pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); return DVERR_OUTOFMEMORY; } pObject->pObject = new CDPVACMConv; if( pObject->pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject; return DVERR_OUTOFMEMORY; } if (!pObject->pObject->InitClass()) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject->pObject; delete pObject; return DVERR_OUTOFMEMORY; } pObject->lpvVtble = &dvconvACMInterface; hr = CDPVACMConv::I_QueryInterface( pObject, riid, ppvObj ); if (FAILED(hr)) { DPFX(DPFPREP, DVF_ERRORLEVEL, "QI failed" ); delete pObject->pObject; delete pObject; } } else if( IsEqualGUID(riid,IID_IUnknown ) ) { if( rclsid == CLSID_DPVCPACM ) { PDPVCPIOBJECT pObject; pObject = new DPVCPIOBJECT; if( pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); return DVERR_OUTOFMEMORY; } pObject->pObject = new CDPVACMI; if(pObject->pObject == NULL) { delete pObject; return DVERR_OUTOFMEMORY; } pObject->lpvVtble = &dvcpvACMInterface; if (!pObject->pObject->InitClass()) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject->pObject; delete pObject; return DVERR_OUTOFMEMORY; } hr = CDPVACMI::QueryInterface( pObject, riid, ppvObj ); if (FAILED(hr)) { DPFX(DPFPREP, DVF_ERRORLEVEL, "QI failed" ); delete pObject->pObject; delete pObject; } } else { PDPVACMCONVOBJECT pObject; pObject = new DPVACMCONVOBJECT; if( pObject == NULL ) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); return DVERR_OUTOFMEMORY; } pObject->pObject = new CDPVACMConv; if(pObject->pObject == NULL) { delete pObject; return DVERR_OUTOFMEMORY; } pObject->lpvVtble = &dvconvACMInterface; if (!pObject->pObject->InitClass()) { DPFX(DPFPREP, DVF_ERRORLEVEL, "Memory alloc failure" ); delete pObject->pObject; delete pObject; return DVERR_OUTOFMEMORY; } hr = CDPVACMConv::I_QueryInterface( pObject, riid, ppvObj ); if (FAILED(hr)) { DPFX(DPFPREP, DVF_ERRORLEVEL, "QI failed" ); delete pObject->pObject; delete pObject; } } } else { return E_NOINTERFACE; } if (SUCCEEDED(hr)) { IncrementObjectCount(); } return hr; } #undef DPF_MODNAME #define DPF_MODNAME "IsClassImplemented" extern "C" BOOL IsClassImplemented(REFCLSID rclsid) { return (IsEqualCLSID(rclsid, CLSID_DPVCPACM) || rclsid == CLSID_DPVCPACM_CONVERTER); }