File indexing completed on 2024-04-21 05:42:25
0001 /* 0002 SPDX-FileCopyrightText: 2003-2006, Sergey Zorin. All rights reserved. 0003 SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com 0004 SPDX-License-Identifier: BSD-2-Clause 0005 */ 0006 #include "class_factory.h" 0007 #include "diff_ext.h" 0008 #include "server.h" 0009 0010 CLASS_FACTORY::CLASS_FACTORY() { 0011 _ref_count = 0L; 0012 0013 SERVER::instance()->lock(); 0014 } 0015 0016 CLASS_FACTORY::~CLASS_FACTORY() { 0017 SERVER::instance()->release(); 0018 } 0019 0020 STDMETHODIMP 0021 CLASS_FACTORY::QueryInterface(REFIID riid, void** ppv) { 0022 HRESULT ret = E_NOINTERFACE; 0023 *ppv = nullptr; 0024 0025 if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { 0026 *ppv = static_cast<CLASS_FACTORY*>(this); 0027 0028 AddRef(); 0029 0030 ret = NOERROR; 0031 } 0032 0033 return ret; 0034 } 0035 0036 STDMETHODIMP_(ULONG) 0037 CLASS_FACTORY::AddRef() { 0038 return InterlockedIncrement((LPLONG)&_ref_count); 0039 } 0040 0041 STDMETHODIMP_(ULONG) 0042 CLASS_FACTORY::Release() { 0043 ULONG ret = 0L; 0044 0045 if(InterlockedDecrement((LPLONG)&_ref_count) != 0) 0046 ret = _ref_count; 0047 else 0048 delete this; 0049 0050 return ret; 0051 } 0052 0053 STDMETHODIMP 0054 CLASS_FACTORY::CreateInstance(IUnknown* outer, REFIID refiid, void** obj) { 0055 HRESULT ret = CLASS_E_NOAGGREGATION; 0056 *obj = 0; 0057 0058 // Shell extensions typically don't support aggregation (inheritance) 0059 if(outer == nullptr) { 0060 DIFF_EXT* ext = new DIFF_EXT(); 0061 0062 if(ext == nullptr) 0063 ret = E_OUTOFMEMORY; 0064 else 0065 ret = ext->QueryInterface(refiid, obj); 0066 } 0067 0068 return ret; 0069 } 0070 0071 STDMETHODIMP 0072 CLASS_FACTORY::LockServer(BOOL) { 0073 return NOERROR; 0074 }