windows-nt/Source/XPSP1/NT/printscan/ui/printui/spinterf.cxx
2020-09-26 16:20:57 +08:00

287 lines
5.9 KiB
C++

/*++
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<HRESULT>(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<fnPrintUIWebPnpEntry*>(
GetProcAddress(g_hWinspool, (LPCSTR)MAKEINTRESOURCE(ordPrintUIWebPnpEntry)));
g_pfnPrintUIWebPnpPostEntry = reinterpret_cast<fnPrintUIWebPnpPostEntry*>(
GetProcAddress(g_hWinspool, (LPCSTR)MAKEINTRESOURCE(ordPrintUIWebPnpPostEntry)));
g_pfnPrintUICreateInstance = reinterpret_cast<fnPrintUICreateInstance*>(
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;
}