Я наблюдаю, что OEMSendPage не вызывается всегда. Когда вызывается OEMSendPage? У нас есть устаревший принтер, который выполняет некоторую обработку внутри OEMSendPage. Я ненавижу перемещать это в другое место в процессе. Это работало, но сейчас я работаю над некоторыми улучшениями и должен это выяснить. Другими командами являются OEMStartPage, OEMStartDo c, OEMTextOut, OEMStartBanding, OEMNextBand, OEMEndDo c. Все они называются, кроме SendPage. В настоящее время я подключаю VS к spool.exe, и принтер устанавливается в порт File :. Когда вызывается команда SendPage?
static const DRVFN s_aOemHookFuncs[] =
#if defined(IMPL_TEXTOUT)
{INDEX_DrvTextOut, (PFN)OEMTextOut},
#endif
#if defined(IMPL_TRANSPARENTBLT)
{INDEX_DrvTransparentBlt, (PFN)OEMTransparentBlt},
#endif
#if defined(IMPL_STARTDOC)
{INDEX_DrvStartDoc, (PFN)OEMStartDoc},
#endif
#if defined(IMPL_ENDDOC)
{INDEX_DrvEndDoc, (PFN)OEMEndDoc},
#endif
#if defined(IMPL_STARTPAGE)
{INDEX_DrvStartPage, (PFN)OEMStartPage},
#endif
#if defined(IMPL_SENDPAGE)
{INDEX_DrvSendPage, (PFN)OEMSendPage},
#endif
В качестве обновления я нашел по следующей ссылке https://docs.microsoft.com/en-us/windows-hardware/drivers/print/rendering-a-print-job# -полоса не используется Поэтому я добавил часть обработки в NextBand также включает SendPage. Но что-то не так. OEMNextBand вызывается несколько раз, а в PCL много страниц. Оригинал только одна страница, но PCL имеет так много страниц. Кто-нибудь может подсказать?
char gszPageText[32767];
BOOL APIENTRY
OEMStartBanding(
SURFOBJ *pso,
POINTL *pptl
)
{
return (pOemPDEV->m_pfnDrvStartBanding)(pso,
pptl);
}
BOOL APIENTRY
OEMNextBand(
SURFOBJ *pso,
POINTL *pptl
)
/*++
{
//VERBOSE(L"OEMNextBand entry.");
PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
// Punt call back to UNIDRV.
BOOL b= (pOemPDEV->m_pfnDrvNextBand)(pso,
pptl);
if (pptl != NULL && pptl->x == -1 && pptl->y == -1)
{
BOOL c = DOPCLProcessingPerPage(pso, gFirstPage, gszPageText);
if (!c)
return TRUE;
}
//if (!CreatePCLRasterGraphicPage(pso, gFirstPage, gszPageText))
//return TRUE;
return b;
}
DrvEnableSurface для вызова EngModifySurface для отключения полос. Я не знаю плюсы и минусы отключения полосы по производительности. Это растровый драйвер
Edited
**For Mono**
StartDoc
-- then for as many pages in the document
StartPage
SendPage
EndDoc
**For Colour**
StartDoc
-- then for as many pages in the document
StartPage
StartBanding
-- then for so many bands
NextBand
SendPage ?? (what is the send page equivalent here for color)
EndDoc
**
Edited for EnableDriverSurface
static const DRVFN s_aOemHookFuncs[] =
{
{INDEX_DrvEndDoc, (PFN)OEMEndDoc},
{INDEX_DrvSendPage, (PFN)OEMSendPage},
{INDEX_DrvStartBanding, (PFN)OEMStartBanding},
{INDEX_DrvNextBand, (PFN)OEMNextBand},
{INDEX_DrvTextOut, (PFN)OEMTextOut},
{INDEX_DrvStartPage, (PFN)OEMStartPage},
{INDEX_DrvStartDoc,(PFN)OEMStartDoc},
//added this
{INDEX_DrvEnableSurface ,(PFN)DrvEnableSurface}
// {INDEX_DrvEnableSurface, (PFN)DrvEnableSurface},
};
HSURF APIENTRY DrvEnableSurface(
DHPDEV dhpdev)
{
HSURF hsurf;
SIZEL sizl;
ULONG ulBitmapType;
FLONG flHooks;
// Create engine bitmap around frame buffer.
PDEVOBJ ppdev = (PDEVOBJ)dhpdev;
POEMPDEV pOemPDEV = (POEMPDEV)ppdev->pdevOEM;
EngModifySurface(hsurf,......)
return(hsurf);
}
**