1 #include "precomp.h" 2 3 #define NDEBUG 4 #include <debug.h> 5 6 LONG dll_refs = 0; 7 8 static HRESULT STDMETHODCALLTYPE 9 IDeskDisplayAdapter_IShellPropSheetExt_QueryInterface(IShellPropSheetExt *iface, 10 REFIID iid, 11 PVOID *pvObject) 12 { 13 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); 14 return IDeskDisplayAdapter_QueryInterface(This, 15 iid, 16 pvObject); 17 } 18 19 static ULONG STDMETHODCALLTYPE 20 IDeskDisplayAdapter_IShellPropSheetExt_AddRef(IShellPropSheetExt* iface) 21 { 22 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); 23 return IDeskDisplayAdapter_AddRef(This); 24 } 25 26 static ULONG STDMETHODCALLTYPE 27 IDeskDisplayAdapter_IShellPropSheetExt_Release(IShellPropSheetExt* iface) 28 { 29 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); 30 return IDeskDisplayAdapter_Release(This); 31 } 32 33 static HRESULT STDMETHODCALLTYPE 34 IDeskDisplayAdapter_IShellPropSheetExt_AddPages(IShellPropSheetExt* iface, 35 LPFNADDPROPSHEETPAGE pfnAddPage, 36 LPARAM lParam) 37 { 38 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); 39 return IDeskDisplayAdapter_AddPages(This, 40 pfnAddPage, 41 lParam); 42 } 43 44 static HRESULT STDMETHODCALLTYPE 45 IDeskDisplayAdapter_IShellPropSheetExt_ReplacePage(IShellPropSheetExt* iface, 46 EXPPS uPageID, 47 LPFNADDPROPSHEETPAGE pfnReplacePage, 48 LPARAM lParam) 49 { 50 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellPropSheetExt); 51 return IDeskDisplayAdapter_ReplacePage(This, 52 uPageID, 53 pfnReplacePage, 54 lParam); 55 } 56 57 static IShellPropSheetExtVtbl efvtIShellPropSheetExt = 58 { 59 IDeskDisplayAdapter_IShellPropSheetExt_QueryInterface, 60 IDeskDisplayAdapter_IShellPropSheetExt_AddRef, 61 IDeskDisplayAdapter_IShellPropSheetExt_Release, 62 IDeskDisplayAdapter_IShellPropSheetExt_AddPages, 63 IDeskDisplayAdapter_IShellPropSheetExt_ReplacePage 64 }; 65 66 static HRESULT STDMETHODCALLTYPE 67 IDeskDisplayAdapter_IShellExtInit_QueryInterface(IShellExtInit *iface, 68 REFIID iid, 69 PVOID *pvObject) 70 { 71 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); 72 return IDeskDisplayAdapter_QueryInterface(This, 73 iid, 74 pvObject); 75 } 76 77 static ULONG STDMETHODCALLTYPE 78 IDeskDisplayAdapter_IShellExtInit_AddRef(IShellExtInit* iface) 79 { 80 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); 81 return IDeskDisplayAdapter_AddRef(This); 82 } 83 84 static ULONG STDMETHODCALLTYPE 85 IDeskDisplayAdapter_IShellExtInit_Release(IShellExtInit* iface) 86 { 87 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); 88 return IDeskDisplayAdapter_Release(This); 89 } 90 91 static HRESULT STDMETHODCALLTYPE 92 IDeskDisplayAdapter_IShellExtInit_Initialize(IShellExtInit* iface, 93 LPCITEMIDLIST pidlFolder, 94 IDataObject *pdtobj, 95 HKEY hkeyProgID) 96 { 97 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IShellExtInit); 98 return IDeskDisplayAdapter_Initialize(This, 99 pidlFolder, 100 pdtobj, 101 hkeyProgID); 102 } 103 104 static IShellExtInitVtbl efvtIShellExtInit = 105 { 106 IDeskDisplayAdapter_IShellExtInit_QueryInterface, 107 IDeskDisplayAdapter_IShellExtInit_AddRef, 108 IDeskDisplayAdapter_IShellExtInit_Release, 109 IDeskDisplayAdapter_IShellExtInit_Initialize 110 }; 111 112 static HRESULT STDMETHODCALLTYPE 113 IDeskDisplayAdapter_IClassFactory_QueryInterface(IClassFactory *iface, 114 REFIID iid, 115 PVOID *pvObject) 116 { 117 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); 118 return IDeskDisplayAdapter_QueryInterface(This, 119 iid, 120 pvObject); 121 } 122 123 static ULONG STDMETHODCALLTYPE 124 IDeskDisplayAdapter_IClassFactory_AddRef(IClassFactory* iface) 125 { 126 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); 127 return IDeskDisplayAdapter_AddRef(This); 128 } 129 130 static ULONG STDMETHODCALLTYPE 131 IDeskDisplayAdapter_IClassFactory_Release(IClassFactory* iface) 132 { 133 PDESKDISPLAYADAPTER This = interface_to_impl(iface, IClassFactory); 134 return IDeskDisplayAdapter_Release(This); 135 } 136 137 static HRESULT STDMETHODCALLTYPE 138 IDeskDisplayAdapter_IClassFactory_CreateInstance(IClassFactory *iface, 139 IUnknown * pUnkOuter, 140 REFIID riid, 141 PVOID *ppvObject) 142 { 143 if (pUnkOuter != NULL && 144 !IsEqualIID(riid, 145 &IID_IUnknown)) 146 { 147 return CLASS_E_NOAGGREGATION; 148 } 149 150 return IDeskDisplayAdapter_Constructor(riid, 151 ppvObject); 152 } 153 154 static HRESULT STDMETHODCALLTYPE 155 IDeskDisplayAdapter_IClassFactory_LockServer(IClassFactory *iface, 156 BOOL fLock) 157 { 158 if (fLock) 159 InterlockedIncrement(&dll_refs); 160 else 161 InterlockedDecrement(&dll_refs); 162 163 return S_OK; 164 } 165 166 static IClassFactoryVtbl efvtIClassFactory = 167 { 168 IDeskDisplayAdapter_IClassFactory_QueryInterface, 169 IDeskDisplayAdapter_IClassFactory_AddRef, 170 IDeskDisplayAdapter_IClassFactory_Release, 171 IDeskDisplayAdapter_IClassFactory_CreateInstance, 172 IDeskDisplayAdapter_IClassFactory_LockServer, 173 }; 174 175 VOID 176 IDeskDisplayAdapter_InitIface(PDESKDISPLAYADAPTER This) 177 { 178 This->lpIShellPropSheetExtVtbl = &efvtIShellPropSheetExt; 179 This->lpIShellExtInitVtbl = &efvtIShellExtInit; 180 This->lpIClassFactoryVtbl = &efvtIClassFactory; 181 182 IDeskDisplayAdapter_AddRef(This); 183 } 184 185 HRESULT WINAPI 186 DllGetClassObject(REFCLSID rclsid, 187 REFIID riid, 188 LPVOID *ppv) 189 { 190 if (ppv == NULL) 191 return E_INVALIDARG; 192 193 *ppv = NULL; 194 if (IsEqualCLSID(rclsid, 195 &CLSID_IDeskDisplayAdapter)) 196 { 197 return IDeskDisplayAdapter_Constructor(riid, 198 ppv); 199 } 200 201 DPRINT1("DllGetClassObject: CLASS_E_CLASSNOTAVAILABLE\n"); 202 return CLASS_E_CLASSNOTAVAILABLE; 203 } 204 205 HRESULT WINAPI 206 DllCanUnloadNow(VOID) 207 { 208 return dll_refs == 0 ? S_OK : S_FALSE; 209 } 210