/*++ Copyright (c) 1994 Microsoft Corporation All rights reserved. Module Name: spinterf.cxx Abstract: spooler private interfaces (private exports in winspool.drv) Author: Lazar Ivanov (LazarI) Jul-05-2000 Revision History: --*/ #include "precomp.hxx" #pragma hdrstop #include "spinterf.hxx" /*++ Title: MakePrnPersistError Routine Description: converts a PRN_PERSIST HRESULT to a Win32 error Arguments: hr - HRESULT to convert Return Value: Win32 error code --*/ DWORD MakePrnPersistError(HRESULT hr) { DWORD err; if(HRESULT_FACILITY(hr) == static_cast(FACILITY_ITF)) { err = ERROR_INVALID_ACCESS; } else { err = HRESULT_CODE(hr); } return err; }; /*++ Title: RestorePrinterSettings Routine Description: applies stored settings on specified printer Arguments: pszPrinterName -- printer name pszFileName -- file name flags -- flags that specify which settings to restore Return Value: S_OK if succeeded PRN_PERSIST hresult ( FACILITY_ITF ) returned by IPrnStream::RestorePrinterInfo Last Error: ERROR_INVALID_ACCESS if hr is a PRN_PERSIST HRESULT an Win32 error code if hr is a predefined HRESULT --*/ HRESULT RestorePrinterSettings( IN LPCTSTR pszPrinterName, IN LPCTSTR pszFileName, IN DWORD flags ) { TStatusB bStatus; TStatusH hr; IPrnStream *pIPrnStream = NULL; CoInitialize( NULL ); hr DBGCHK = CoCreateInstance( CLSID_PrintUIShellExtension, 0, CLSCTX_INPROC_SERVER, IID_IPrnStream, (VOID**)&pIPrnStream ); if( SUCCEEDED( hr ) ) { hr DBGCHK = pIPrnStream->BindPrinterAndFile(pszPrinterName,pszFileName); if(SUCCEEDED(hr)) { hr DBGCHK = pIPrnStream->RestorePrinterInfo(flags); } pIPrnStream->Release(); } CoUninitialize(); if(FAILED(hr)) { SetLastError(MakePrnPersistError(hr)); } return hr; } /*++ Title: StorePrinterSettings Routine Description: store printer settings into file Arguments: pszPrinterName -- printer name pszFileName -- file name flags -- specify which settings to store Return Value: S_OK if succeeded PRN_PERSIST hresult ( FACILITY_ITF ) returned by IPrnStream::StorePrinterInfo Last Error: ERROR_INVALID_ACCESS if hr is a PRN_PERSIST HRESULT an Win32 error code if hr is a predefined HRESULT --*/ HRESULT StorePrinterSettings( IN LPTSTR pszPrinterName, IN LPTSTR pszFileName, IN DWORD flags ) { TStatusB bStatus; TStatusH hr; IPrnStream *pIPrnStream = NULL; CoInitialize( NULL ); hr DBGCHK = CoCreateInstance( CLSID_PrintUIShellExtension, 0, CLSCTX_INPROC_SERVER, IID_IPrnStream, (VOID**)&pIPrnStream ); if( SUCCEEDED( hr ) ) { hr DBGCHK = pIPrnStream->BindPrinterAndFile(pszPrinterName,pszFileName); if(SUCCEEDED(hr)) { hr DBGCHK = pIPrnStream->StorePrinterInfo(flags); } pIPrnStream->Release(); } CoUninitialize(); if(FAILED(hr)) { SetLastError(MakePrnPersistError(hr)); } return hr; } extern "C" { // prototypes of some private APIs exported from splcore.dll typedef HRESULT WINAPI fnPrintUIWebPnpEntry(LPCTSTR lpszCmdLine); typedef HRESULT WINAPI fnPrintUIWebPnpPostEntry(BOOL fConnection, LPCTSTR lpszBinFile, LPCTSTR lpszPortName, LPCTSTR lpszPrtName); typedef HRESULT WINAPI fnPrintUICreateInstance(REFIID riid, void **ppv); enum { // the export ordinals for each function ordPrintUIWebPnpEntry = 226, ordPrintUIWebPnpPostEntry = 227, ordPrintUICreateInstance = 228, }; } // extern "C" static HMODULE g_hWinspool = NULL; static fnPrintUIWebPnpEntry *g_pfnPrintUIWebPnpEntry = NULL; static fnPrintUIWebPnpPostEntry *g_pfnPrintUIWebPnpPostEntry = NULL; static fnPrintUICreateInstance *g_pfnPrintUICreateInstance = NULL; HRESULT Winspool_WebPnpEntry(LPCTSTR lpszCmdLine) { return g_pfnPrintUIWebPnpEntry ? g_pfnPrintUIWebPnpEntry(lpszCmdLine) : E_FAIL; } HRESULT Winspool_WebPnpPostEntry(BOOL fConnection, LPCTSTR lpszBinFile, LPCTSTR lpszPortName, LPCTSTR lpszPrtName) { return g_pfnPrintUIWebPnpPostEntry ? g_pfnPrintUIWebPnpPostEntry( fConnection, lpszBinFile, lpszPortName, lpszPrtName) : E_FAIL; } HRESULT Winspool_CreateInstance(REFIID riid, void **ppv) { return g_pfnPrintUICreateInstance ? g_pfnPrintUICreateInstance(riid, ppv) : E_FAIL; } // init/shutdown of splcore.dll HRESULT Winspool_Init() { HRESULT hr = E_FAIL; g_hWinspool = LoadLibrary(TEXT("winspool.drv")); if( g_hWinspool ) { g_pfnPrintUIWebPnpEntry = reinterpret_cast( GetProcAddress(g_hWinspool, (LPCSTR)MAKEINTRESOURCE(ordPrintUIWebPnpEntry))); g_pfnPrintUIWebPnpPostEntry = reinterpret_cast( GetProcAddress(g_hWinspool, (LPCSTR)MAKEINTRESOURCE(ordPrintUIWebPnpPostEntry))); g_pfnPrintUICreateInstance = reinterpret_cast( GetProcAddress(g_hWinspool, (LPCSTR)MAKEINTRESOURCE(ordPrintUICreateInstance))); if( g_pfnPrintUIWebPnpEntry && g_pfnPrintUIWebPnpPostEntry && g_pfnPrintUICreateInstance ) { hr = S_OK; } else { g_pfnPrintUIWebPnpEntry = NULL; g_pfnPrintUIWebPnpPostEntry = NULL; g_pfnPrintUICreateInstance = NULL; FreeLibrary(g_hWinspool); g_hWinspool = NULL; } } return hr; } HRESULT Winspool_Done() { if( g_hWinspool ) { g_pfnPrintUIWebPnpEntry = NULL; g_pfnPrintUIWebPnpPostEntry = NULL; g_pfnPrintUICreateInstance = NULL; FreeLibrary(g_hWinspool); g_hWinspool = NULL; } return S_OK; }