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