1*25c7e1a8SPierre Schweitzer /*
2*25c7e1a8SPierre Schweitzer 	vfdshcfact.cpp
3*25c7e1a8SPierre Schweitzer 
4*25c7e1a8SPierre Schweitzer 	Virtual Floppy Drive for Windows
5*25c7e1a8SPierre Schweitzer 	Driver control library
6*25c7e1a8SPierre Schweitzer 	shell extension COM class factory class
7*25c7e1a8SPierre Schweitzer 
8*25c7e1a8SPierre Schweitzer 	Copyright (c) 2003-2005 Ken Kato
9*25c7e1a8SPierre Schweitzer */
10*25c7e1a8SPierre Schweitzer 
11*25c7e1a8SPierre Schweitzer #define WIN32_LEAN_AND_MEAN
12*25c7e1a8SPierre Schweitzer #include <windows.h>
13*25c7e1a8SPierre Schweitzer #include <shlobj.h>
14*25c7e1a8SPierre Schweitzer 
15*25c7e1a8SPierre Schweitzer #include "vfdtypes.h"
16*25c7e1a8SPierre Schweitzer #include "vfdlib.h"
17*25c7e1a8SPierre Schweitzer #include "vfdshext.h"
18*25c7e1a8SPierre Schweitzer 
19*25c7e1a8SPierre Schweitzer //	class header
20*25c7e1a8SPierre Schweitzer #include "vfdshcfact.h"
21*25c7e1a8SPierre Schweitzer 
22*25c7e1a8SPierre Schweitzer //
23*25c7e1a8SPierre Schweitzer //	constructor
24*25c7e1a8SPierre Schweitzer //
CVfdFactory()25*25c7e1a8SPierre Schweitzer CVfdFactory::CVfdFactory()
26*25c7e1a8SPierre Schweitzer {
27*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::CVfdFactory()\n"));
28*25c7e1a8SPierre Schweitzer 
29*25c7e1a8SPierre Schweitzer 	m_cRefCnt = 0L;
30*25c7e1a8SPierre Schweitzer 
31*25c7e1a8SPierre Schweitzer 	g_cDllRefCnt++;
32*25c7e1a8SPierre Schweitzer }
33*25c7e1a8SPierre Schweitzer 
34*25c7e1a8SPierre Schweitzer //
35*25c7e1a8SPierre Schweitzer //	destructor
36*25c7e1a8SPierre Schweitzer //
~CVfdFactory()37*25c7e1a8SPierre Schweitzer CVfdFactory::~CVfdFactory()
38*25c7e1a8SPierre Schweitzer {
39*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::~CVfdFactory()\n"));
40*25c7e1a8SPierre Schweitzer 
41*25c7e1a8SPierre Schweitzer 	g_cDllRefCnt--;
42*25c7e1a8SPierre Schweitzer }
43*25c7e1a8SPierre Schweitzer 
44*25c7e1a8SPierre Schweitzer //
45*25c7e1a8SPierre Schweitzer //	IUnknown methods
46*25c7e1a8SPierre Schweitzer //
QueryInterface(REFIID riid,LPVOID * ppv)47*25c7e1a8SPierre Schweitzer STDMETHODIMP CVfdFactory::QueryInterface(
48*25c7e1a8SPierre Schweitzer 	REFIID			riid,
49*25c7e1a8SPierre Schweitzer 	LPVOID			*ppv)
50*25c7e1a8SPierre Schweitzer {
51*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::QueryInterface()\n"));
52*25c7e1a8SPierre Schweitzer 
53*25c7e1a8SPierre Schweitzer 	*ppv = NULL;
54*25c7e1a8SPierre Schweitzer 
55*25c7e1a8SPierre Schweitzer 	if (IsEqualIID(riid, IID_IUnknown) ||
56*25c7e1a8SPierre Schweitzer 		IsEqualIID(riid, IID_IClassFactory)) {
57*25c7e1a8SPierre Schweitzer 		*ppv = (LPCLASSFACTORY)this;
58*25c7e1a8SPierre Schweitzer 
59*25c7e1a8SPierre Schweitzer 		AddRef();
60*25c7e1a8SPierre Schweitzer 
61*25c7e1a8SPierre Schweitzer 		return NOERROR;
62*25c7e1a8SPierre Schweitzer 	}
63*25c7e1a8SPierre Schweitzer 
64*25c7e1a8SPierre Schweitzer 	return E_NOINTERFACE;
65*25c7e1a8SPierre Schweitzer }
66*25c7e1a8SPierre Schweitzer 
STDMETHODIMP_(ULONG)67*25c7e1a8SPierre Schweitzer STDMETHODIMP_(ULONG) CVfdFactory::AddRef()
68*25c7e1a8SPierre Schweitzer {
69*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::AddRef()\n"));
70*25c7e1a8SPierre Schweitzer 
71*25c7e1a8SPierre Schweitzer 	return ++m_cRefCnt;
72*25c7e1a8SPierre Schweitzer }
73*25c7e1a8SPierre Schweitzer 
STDMETHODIMP_(ULONG)74*25c7e1a8SPierre Schweitzer STDMETHODIMP_(ULONG) CVfdFactory::Release()
75*25c7e1a8SPierre Schweitzer {
76*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::Release()\n"));
77*25c7e1a8SPierre Schweitzer 
78*25c7e1a8SPierre Schweitzer 	if (--m_cRefCnt) {
79*25c7e1a8SPierre Schweitzer 		return m_cRefCnt;
80*25c7e1a8SPierre Schweitzer 	}
81*25c7e1a8SPierre Schweitzer 
82*25c7e1a8SPierre Schweitzer #ifndef __REACTOS__
83*25c7e1a8SPierre Schweitzer 	delete this;
84*25c7e1a8SPierre Schweitzer #endif
85*25c7e1a8SPierre Schweitzer 
86*25c7e1a8SPierre Schweitzer 	return 0L;
87*25c7e1a8SPierre Schweitzer }
88*25c7e1a8SPierre Schweitzer 
89*25c7e1a8SPierre Schweitzer //
90*25c7e1a8SPierre Schweitzer // IClassFactory methods
91*25c7e1a8SPierre Schweitzer //
CreateInstance(LPUNKNOWN pUnkOuter,REFIID riid,LPVOID * ppvObj)92*25c7e1a8SPierre Schweitzer STDMETHODIMP CVfdFactory::CreateInstance(
93*25c7e1a8SPierre Schweitzer 	LPUNKNOWN		pUnkOuter,
94*25c7e1a8SPierre Schweitzer 	REFIID			riid,
95*25c7e1a8SPierre Schweitzer 	LPVOID			*ppvObj)
96*25c7e1a8SPierre Schweitzer {
97*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::CreateInstance()\n"));
98*25c7e1a8SPierre Schweitzer 
99*25c7e1a8SPierre Schweitzer 	*ppvObj = NULL;
100*25c7e1a8SPierre Schweitzer 
101*25c7e1a8SPierre Schweitzer 	// Shell extensions typically don't support
102*25c7e1a8SPierre Schweitzer 	// aggregation (inheritance)
103*25c7e1a8SPierre Schweitzer 
104*25c7e1a8SPierre Schweitzer 	if (pUnkOuter) {
105*25c7e1a8SPierre Schweitzer 		return CLASS_E_NOAGGREGATION;
106*25c7e1a8SPierre Schweitzer 	}
107*25c7e1a8SPierre Schweitzer 
108*25c7e1a8SPierre Schweitzer 	// Create the main shell extension object.
109*25c7e1a8SPierre Schweitzer 	// The shell will then call QueryInterface with IID_IShellExtInit
110*25c7e1a8SPierre Schweitzer 	// -- this is how shell extensions are initialized.
111*25c7e1a8SPierre Schweitzer 
112*25c7e1a8SPierre Schweitzer 	LPCVFDSHEXT pVfdShExt = new CVfdShExt;
113*25c7e1a8SPierre Schweitzer 
114*25c7e1a8SPierre Schweitzer 	if (!pVfdShExt) {
115*25c7e1a8SPierre Schweitzer 		return E_OUTOFMEMORY;
116*25c7e1a8SPierre Schweitzer 	}
117*25c7e1a8SPierre Schweitzer 
118*25c7e1a8SPierre Schweitzer 	return pVfdShExt->QueryInterface(riid, ppvObj);
119*25c7e1a8SPierre Schweitzer }
120*25c7e1a8SPierre Schweitzer 
LockServer(BOOL fLock)121*25c7e1a8SPierre Schweitzer STDMETHODIMP CVfdFactory::LockServer(BOOL fLock)
122*25c7e1a8SPierre Schweitzer {
123*25c7e1a8SPierre Schweitzer 	VFDTRACE(0, ("CVfdFactory::LockServer()\n"));
124*25c7e1a8SPierre Schweitzer 	UNREFERENCED_PARAMETER(fLock);
125*25c7e1a8SPierre Schweitzer 	return NOERROR;
126*25c7e1a8SPierre Schweitzer }
127