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