diff options
| author | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
|---|---|---|
| committer | Dave Wilson <[email protected]> | 2015-03-17 19:50:07 -0700 |
| commit | 97cf5197cf5b882b2c689d8dc2b555f2edf8f418 (patch) | |
| tree | 46f3701832d70b420eb0fc0eb93261f9da45db3f /print/XpsRasFilter/src/dllentry.cpp | |
| parent | ef1905bf1e8825bb31120dfb27e0daf3154d859a (diff) | |
Initial publish
Diffstat (limited to 'print/XpsRasFilter/src/dllentry.cpp')
| -rw-r--r-- | print/XpsRasFilter/src/dllentry.cpp | 326 |
1 files changed, 326 insertions, 0 deletions
diff --git a/print/XpsRasFilter/src/dllentry.cpp b/print/XpsRasFilter/src/dllentry.cpp new file mode 100644 index 00000000..8e19ae16 --- /dev/null +++ b/print/XpsRasFilter/src/dllentry.cpp @@ -0,0 +1,326 @@ +// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF +// ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO +// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A +// PARTICULAR PURPOSE. +// +// Copyright (c) Microsoft Corporation. All rights reserved +// +// File Name: +// +// dllentry.cpp +// +// Abstract: +// +// Xps Rasterization Service filter DLL entry points. +// + +#include "precomp.h" +#include "WppTrace.h" +#include "Exception.h" +#include "filtertypes.h" +#include "UnknownBase.h" +#include "xpsrasfilter.h" + +#include "dllentry.tmh" + +namespace xpsrasfilter +{ + +// +// Class Factory returned by DllGetClassObject() +// +class __declspec( uuid("CFF7BE69-E62D-403b-BE4F-48EC73F5DA1A") ) XPSRasFilterFactory : public UnknownBase<IClassFactory> +{ +public: + XPSRasFilterFactory() : + m_serverLocks(0) + { + ::InterlockedIncrement(&XPSRasFilter::ms_numObjects); + } + + ~XPSRasFilterFactory() + { + ::InterlockedDecrement(&XPSRasFilter::ms_numObjects); + } + + // + //Routine Name: + // + // XPSRasFilterFactory::CreateInstance + // + //Routine Description: + // + // Returns an instance of XPSRasFilter. + // + //Arguments: + // + // pUnkOuter - Outer class (must be NULL) + // riid - Requested interface (IPrintPipelineFilter) + // ppvObject - Pointer to the requested interface + // + //Return Value: + // + // HRESULT + // S_OK - On success + // Otherwise - Failure + // + HRESULT + STDMETHODCALLTYPE + CreateInstance( + IUnknown *pUnkOuter, + REFIID riid, + void **ppvObject + ) + { + HRESULT hr = S_OK; + + if (pUnkOuter != NULL) + { + WPP_LOG_ON_FAILED_HRESULT(CLASS_E_NOAGGREGATION); + + return CLASS_E_NOAGGREGATION; + } + + if (ppvObject == NULL) + { + WPP_LOG_ON_FAILED_HRESULT(E_POINTER); + + return E_POINTER; + } + + *ppvObject = NULL; + + xpsrasfilter::XPSRasFilter *pFilter = NULL; + + // + // XpsRasFilter::XpsRasFilter() can throw, as can new + // + try + { + DoTraceMessage(XPSRASFILTER_TRACE_INFO, L"Instantiating filter"); + pFilter = new xpsrasfilter::XPSRasFilter(); + } + CATCH_VARIOUS(hr) + + if (SUCCEEDED(hr)) + { + WPP_LOG_ON_FAILED_HRESULT( + hr = pFilter->QueryInterface(riid, ppvObject) + ); + + pFilter->Release(); + } + + return hr; + } + + // + //Routine Name: + // + // XPSRasFilterFactory::LockServer + // + //Routine Description: + // + // Allows clients to lock the filter factory in + // memory. + // + //Arguments: + // + // fLock - TRUE - lock; FALSE - unlock + // + //Return Value: + // + // HRESULT + // S_OK - On success + // + HRESULT + STDMETHODCALLTYPE + LockServer( + BOOL fLock + ) + { + LONG result; + + if (fLock) // lock + { + result = ::InterlockedIncrement(&m_serverLocks); + + if (result == 1) + { + // + // This was the first 'lock' call; increment the + // global numObjects + // + ::InterlockedIncrement(&XPSRasFilter::ms_numObjects); + } + } + else // unlock + { + result = ::InterlockedDecrement(&m_serverLocks); + + if (result == 0) + { + // + // All locks have been unlocked; decrement the + // global numObjects + // + ::InterlockedDecrement(&XPSRasFilter::ms_numObjects); + } + } + + return S_OK; + } + +private: + volatile LONG m_serverLocks; +}; + +} // namespace xpsrasfilter + +// +//Routine Name: +// +// DllGetClassObject +// +//Routine Description: +// +// Returns an instance of XPSRasFilterFactory. +// +//Arguments: +// +// rclsid - Requested class (XPSRasFilter) +// riid - Requested interface (IClassFactory) +// ppv - Pointer to the requested interface +// +//Return Value: +// +// HRESULT +// S_OK - On success +// Otherwise - Failure +// +STDAPI +DllGetClassObject( + _In_ REFCLSID rclsid, + _In_ REFIID riid, + _Outptr_ LPVOID *ppv + ) +{ + HRESULT hr = S_OK; + + if (ppv == NULL) + { + WPP_LOG_ON_FAILED_HRESULT(E_POINTER); + + return E_POINTER; + } + + *ppv = NULL; + + if (rclsid != __uuidof(xpsrasfilter::XPSRasFilterFactory)) + { + WPP_LOG_ON_FAILED_HRESULT(CLASS_E_CLASSNOTAVAILABLE); + + return CLASS_E_CLASSNOTAVAILABLE; + } + + DoTraceMessage(XPSRASFILTER_TRACE_INFO, L"Instantiating class factory"); + + xpsrasfilter::XPSRasFilterFactory *pFactory = NULL; + pFactory = new(std::nothrow) xpsrasfilter::XPSRasFilterFactory(); + + if (pFactory == NULL) + { + WPP_LOG_ON_FAILED_HRESULT(E_OUTOFMEMORY); + + hr = E_OUTOFMEMORY; + } + + if (SUCCEEDED(hr)) + { + WPP_LOG_ON_FAILED_HRESULT( + hr = pFactory->QueryInterface(riid, ppv) + ); + + pFactory->Release(); + } + + return hr; +} + +// +//Routine Name: +// +// DllCanUnloadNow +// +//Routine Description: +// +// Checks whether the DLL can be unloaded. That is, +// whether there are any instances of XPSRasFilter. +// +//Arguments: +// +// None +// +//Return Value: +// +// HRESULT +// S_OK - Can unload. +// Otherwise - Cannot unload. +// +STDAPI +DllCanUnloadNow() +{ + return (0 == xpsrasfilter::XPSRasFilter::ms_numObjects) ? S_OK : S_FALSE; +} + +// +//Routine Name: +// +// DllMain +// +//Routine Description: +// +// Initializes WPP tracing when the DLL is loaded +// and cleans up WPP tracing when the DLL is unloaded. +// +//Arguments: +// +// None +// +//Return Value: +// +// HRESULT +// S_OK - On success. +// Otherwise - Otherwise. +// +extern "C" +BOOL +WINAPI +DllMain( + _In_ HINSTANCE hinstDLL, + _In_ DWORD fdwReason, + _In_opt_ LPVOID /*lpvReserved*/ + ) +{ + switch(fdwReason) + { + case DLL_PROCESS_ATTACH: + + ::DisableThreadLibraryCalls(hinstDLL); + + WPP_INIT_TRACING(L"XpsRasFilter"); + DoTraceMessage(XPSRASFILTER_TRACE_INFO, L"DLL_PROCESS_ATTACH"); + + break; + + case DLL_PROCESS_DETACH: + + DoTraceMessage(XPSRASFILTER_TRACE_INFO, L"DLL_PROCESS_DETACH"); + WPP_CLEANUP(); + + break; + } + + return TRUE; +} + |
