Re: How implement DrvWriteAbortBuf ? by Benoit
Benoit
Tue Nov 25 05:06:06 CST 2003
> I've just tried sticking it in one of our drivers and it works here, the
> text is properly injected when job is cancelled. Except I have used
> IPrintOemDriverUni interface instead of pDrvProcs of POEMPDEV. Can you try
> it with IPrintOemDriverUni instead? pDrvProcs is not supposed to be used
by
> rendering plug-ins that have COM interface. Code is something like this:
>
> BOOL APIENTRY XEndDoc (SURFOBJ *pso, FLONG fl)
> {
> ...
> IPrinterOemDriverUni *ipodu; <- get that from PublishDriverInterface
> DWORD written;
> HRESULT retval = ipodu->DrvWriteSpoolBuf (reinterpret_cast <DEVOBJ *>
> (pso->dhpdev), "RAZ", 3, &written);
> if (retval == E_FAIL)
> {
> retval = ipodu->DrvWriteAbortBuf (reinterpret_cast <DEVOBJ *>
> (pso->dhpdev), "<RAZ>", 5, 30);
> }
> ...
> }
>
I have try your code, but it doesn't build.
I have include <PRCOMOEM.H> in ddihook.cpp. Is it right ?
I have this error (for the line IPrintOemDriverUni *ipodu;):
dihook.cpp(701) : error C4700: local variable 'ipodu' used without having
been initialized
What do you mean with: "get that from PublishDriverIntercace"
This is my PublishDriverInterface in intrface.cpp:
----------------------------------------------------------------------------
------
HRESULT __stdcall IOemUni::PublishDriverInterface(IUnknown *pIUnknown)
{
VERBOSE(DLLTEXT("IOemUni::PublishDriverInterface() entry.\r\n"));
// Need to store pointer to Driver Helper functions, if we already
haven't.
if (this->m_pOEMHelp == NULL)
{
HRESULT hResult;
// Get Interface to Helper Functions.
hResult = pIUnknown->QueryInterface(IID_IPrintOemDriverUni,
(void** ) &(this->m_pOEMHelp));
if(!SUCCEEDED(hResult))
{
// Make sure that interface pointer reflects interface query
failure.
this->m_pOEMHelp = NULL;
return E_FAIL;
}
}
return S_OK;
}
----------------------------------------------------------------------------
------
and my IOemUni class declaration:
----------------------------------------------------------------------------
------
////////////////////////////////////////////////////////////////////////////
////
//
// IOemUni
//
// Interface for Unidrv OEM sample rendering module
//
class IOemUni : public IPrintOemUni
{
public:
public:
// *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID FAR* ppvObj);
STDMETHOD_(ULONG,AddRef) (THIS);
STDMETHOD_(ULONG,Release) (THIS);
// Method for publishing Driver interface.
STDMETHOD(PublishDriverInterface)(THIS_ IUnknown *pIUnknown);
// Method for getting the implemented methods.
// Returns S_OK if the given method is implemneted.
// Returns S_FALSE if the given method is notimplemneted.
STDMETHOD(GetImplementedMethod)(THIS_ PSTR pMethodName);
// Method for OEM to specify DDI hook out
STDMETHOD(EnableDriver) (THIS_ DWORD DriverVersion,
DWORD cbSize,
PDRVENABLEDATA pded);
// Method to notify OEM plugin that it is no longer required
STDMETHOD(DisableDriver) (THIS);
// Method for OEM to contruct its own PDEV
STDMETHOD(EnablePDEV) (THIS_ PDEVOBJ pdevobj,
PWSTR pPrinterName,
ULONG cPatterns,
HSURF *phsurfPatterns,
ULONG cjGdiInfo,
GDIINFO *pGdiInfo,
ULONG cjDevInfo,
DEVINFO *pDevInfo,
DRVENABLEDATA *pded,
OUT PDEVOEM *pDevOem);
// Method for OEM to free any resource associated with its PDEV
STDMETHOD(DisablePDEV) (THIS_ PDEVOBJ pdevobj);
// Method for OEM to transfer from old PDEV to new PDEV
STDMETHOD(ResetPDEV) (THIS_ PDEVOBJ pdevobjOld,
PDEVOBJ pdevobjNew);
// Get OEM dll related information
STDMETHOD(GetInfo) (THIS_ DWORD dwMode,
PVOID pBuffer,
DWORD cbSize,
PDWORD pcbNeeded);
// OEMDriverDMS - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(DriverDMS)(THIS_ PVOID pDevObj,
PVOID pBuffer,
DWORD cbSize,
PDWORD pcbNeeded);
// OEMDevMode
STDMETHOD(DevMode) (THIS_ DWORD dwMode,
POEMDMPARAM pOemDMParam);
// OEMCommandCallback - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(CommandCallback)(THIS_ PDEVOBJ pdevobj,
DWORD dwCallbackID,
DWORD dwCount,
PDWORD pdwParams,
OUT INT *piResult);
// OEMImageProcessing - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(ImageProcessing)(THIS_ PDEVOBJ pdevobj,
PBYTE pSrcBitmap,
PBITMAPINFOHEADER pBitmapInfoHeader,
PBYTE pColorTable,
DWORD dwCallbackID,
PIPPARAMS pIPParams,
OUT PBYTE *ppbResult);
// OEMFilterGraphics - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(FilterGraphics) (THIS_ PDEVOBJ pdevobj,
PBYTE pBuf,
DWORD dwLen);
// OEMCompression - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(Compression)(THIS_ PDEVOBJ pdevobj,
PBYTE pInBuf,
PBYTE pOutBuf,
DWORD dwInLen,
DWORD dwOutLen,
OUT INT *piResult);
// OEMHalftone - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(HalftonePattern) (THIS_ PDEVOBJ pdevobj,
PBYTE pHTPattern,
DWORD dwHTPatternX,
DWORD dwHTPatternY,
DWORD dwHTNumPatterns,
DWORD dwCallbackID,
PBYTE pResource,
DWORD dwResourceSize);
// OEMMemoryUsage - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(MemoryUsage) (THIS_ PDEVOBJ pdevobj,
POEMMEMORYUSAGE pMemoryUsage);
// OEMTTYGetInfo - UNIDRV only, return E_NOTIMPL on Pscript
STDMETHOD(TTYGetInfo)(THIS_ PDEVOBJ pdevobj,
DWORD dwInfoIndex,
PVOID pOutputBuf,
DWORD dwSize,
DWORD *pcbcNeeded);
// OEMDownloadFontheader - UNIDRV only
STDMETHOD(DownloadFontHeader)(THIS_ PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
OUT DWORD *pdwResult);
// OEMDownloadCharGlyph - UNIDRV only
STDMETHOD(DownloadCharGlyph)(THIS_ PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
HGLYPH hGlyph,
PDWORD pdwWidth,
OUT DWORD *pdwResult);
// OEMTTDownloadMethod - UNIDRV only
STDMETHOD(TTDownloadMethod)(THIS_ PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
OUT DWORD *pdwResult);
// OEMOutputCharStr - UNIDRV only
STDMETHOD(OutputCharStr)(THIS_ PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
DWORD dwType,
DWORD dwCount,
PVOID pGlyph);
// OEMSendFontCmd - UNIDRV only
STDMETHOD(SendFontCmd)(THIS_ PDEVOBJ pdevobj,
PUNIFONTOBJ pUFObj,
PFINVOCATION pFInv);
// OEMTextOutAsBitmap - UNIDRV only
STDMETHOD(TextOutAsBitmap)(THIS_ SURFOBJ *pso,
STROBJ *pstro,
FONTOBJ *pfo,
CLIPOBJ *pco,
RECTL *prclExtra,
RECTL *prclOpaque,
BRUSHOBJ *pboFore,
BRUSHOBJ *pboOpaque,
POINTL *pptlOrg,
MIX mix);
IOemUni() { m_cRef = 1; m_pOEMHelp = NULL; };
~IOemUni();
protected:
LONG m_cRef;
IPrintOemDriverUni* m_pOEMHelp; //IPrintK8DriverUni* m_pOEMHelp; ////
};
----------------------------------------------------------------------------
------
Must I do something else ?
Thanks a lot for your help.