287 lines
5.9 KiB
C++
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;
|
||
|
}
|
||
|
|