1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/*
SPDX-FileCopyrightText: 2003-2006, Sergey Zorin. All rights reserved.
SPDX-FileCopyrightText: 2018-2020 Michael Reeves reeves.87@gmail.com
SPDX-License-Identifier: BSD-2-Clause
*/
#include "class_factory.h"
#include "diff_ext.h"
#include "server.h"
CLASS_FACTORY::CLASS_FACTORY() {
_ref_count = 0L;
SERVER::instance()->lock();
}
CLASS_FACTORY::~CLASS_FACTORY() {
SERVER::instance()->release();
}
STDMETHODIMP
CLASS_FACTORY::QueryInterface(REFIID riid, void** ppv) {
HRESULT ret = E_NOINTERFACE;
*ppv = nullptr;
if(IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) {
*ppv = static_cast<CLASS_FACTORY*>(this);
AddRef();
ret = NOERROR;
}
return ret;
}
STDMETHODIMP_(ULONG)
CLASS_FACTORY::AddRef() {
return InterlockedIncrement((LPLONG)&_ref_count);
}
STDMETHODIMP_(ULONG)
CLASS_FACTORY::Release() {
ULONG ret = 0L;
if(InterlockedDecrement((LPLONG)&_ref_count) != 0)
ret = _ref_count;
else
delete this;
return ret;
}
STDMETHODIMP
CLASS_FACTORY::CreateInstance(IUnknown* outer, REFIID refiid, void** obj) {
HRESULT ret = CLASS_E_NOAGGREGATION;
*obj = nullptr;
// Shell extensions typically don't support aggregation (inheritance)
if(outer == nullptr) {
DIFF_EXT* ext = new DIFF_EXT();
if(ext == nullptr)
ret = E_OUTOFMEMORY;
else
ret = ext->QueryInterface(refiid, obj);
}
return ret;
}
STDMETHODIMP
CLASS_FACTORY::LockServer(BOOL) {
return NOERROR;
}
|