I have also done the same thing… But selected the port to be “file” port rather than what you were all saying… The problem is that if i print a report containing more than one page… Every thing is getting printed into a single BMP image rather than separate BMP for separate page… If a MS Word Document containing more than one page is printed then it buffers all pages but prints only First page…
Is it necessary to create a special port monitor to overcome this problem… If so then like what sample in DDK kit is needed… Every one said me to write the OEMSendPage routine… I have written it… But it doesn’t work… Check whether any errors are there…
…header files…
LPCTSTR ConvertToString(DWORD pointer)
{
LPCTSTR a = (LPCTSTR) pointer;
return a;
}
BOOL APIENTRY
OEMEndDoc(
SURFOBJ *pso,
FLONG fl
)
/*++
Routine Description:
Implementation of DDI hook for DrvEndDoc.
DrvEndDoc is called by GDI when it has finished
sending a document to the driver for rendering.
This particular implementation of OEMEndDoc performs
the following operations:
- Dump the bitmap file header
- Dump the bitmap info header
- Dump the color table if one exists
- Dump the buffered bitmap data
- Free the memory for the data buffers
Arguments:
pso - Defines the surface object
flags - A set of flag bits
Return Value:
TRUE if successful, FALSE if there is an error
–*/
{
OEMDBG(DBG_VERBOSE, L"OEMEndDoc entry.");
PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
DWORD dwWritten;
INT cScans;
if (pOemPDEV->pBufStart)
{
// Fill BitmapFileHeader
//
DWORD dwTotalBytes = pOemPDEV->cbHeaderOffBits + pOemPDEV->bmInfoHeader.biSizeImage; // File size
pOemPDEV->bmFileHeader.bfType = 0x4d42; // Signature = ‘BM’
pOemPDEV->bmFileHeader.bfSize = dwTotalBytes; // Bytes in whole file.
pOemPDEV->bmFileHeader.bfReserved1 = 0;
pOemPDEV->bmFileHeader.bfReserved2 = 0;
pOemPDEV->bmFileHeader.bfOffBits = pOemPDEV->cbHeaderOffBits; // Offset to bits in file.
if (pOemPDEV->bColorTable)
pOemPDEV->bmFileHeader.bfOffBits += pOemPDEV->cPalColors * sizeof(ULONG);
// Num of scanlines
//
cScans = pOemPDEV->bmInfoHeader.biHeight;
// Flip the biHeight member so that it denotes top-down bitmap
//
pOemPDEV->bmInfoHeader.biHeight = cScans * -1;
// Dump headers first
//
dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmFileHeader), sizeof(BITMAPFILEHEADER));
dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, (void*)&(pOemPDEV->bmInfoHeader), sizeof(BITMAPINFOHEADER));
if (pOemPDEV->bColorTable)
{
dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->prgbq, pOemPDEV->cPalColors * sizeof(ULONG));
LocalFree(pOemPDEV->prgbq);
}
// Dump the data now
//
dwWritten = pDevObj->pDrvProcs->DrvWriteSpoolBuf(pDevObj, pOemPDEV->pBufStart, pOemPDEV->bmInfoHeader.biSizeImage);
// Free memory for the data buffers
//
vFreeBuffer(pOemPDEV);
}
// Punt call back to UNIDRV.
//
return (pOemPDEV->m_pfnDrvEndDoc)(pso,
fl);
}
BOOL OEMSendPage(IN SURFOBJ *pso)
{
/*Create File Name
& its handler*/
DWORD tickcountval = GetTickCount();
DWORD oError;
LPCTSTR objTest = ConvertToString(tickcountval);
LPDWORD ByteWritten = new DWORD;
//end creation of file
OEMDBG(DBG_VERBOSE, L"OEMSendPage entry.");
PDEVOBJ pDevObj = (PDEVOBJ)pso->dhpdev;
POEMPDEV pOemPDEV = (POEMPDEV)pDevObj->pdevOEM;
COemUniDbg objDevug(1,(WCHAR*)“Dumping the OEMSendPage DEBUG Error”);
DWORD dwWritten;
INT cScans;
if (pOemPDEV->pBufStart)
{
HANDLE objEndFileHandle =::CreateFile(
objTest,
GENERIC_WRITE,
0, //dont share the file
NULL, //SECURITY_ATTRIBUTES –> Handle cannot be inherited
CREATE_NEW,
FILE_ATTRIBUTE_NORMAL,
NULL);
// Fill BitmapFileHeader
//
DWORD dwTotalBytes = pOemPDEV->cbHeaderOffBits +
pOemPDEV->bmInfoHeader.biSizeImage; // File size
pOemPDEV->bmFileHeader.bfType = 0x4d42; // Signature = ‘BM’
pOemPDEV->bmFileHeader.bfSize = dwTotalBytes; // Bytes in whole file.
pOemPDEV->bmFileHeader.bfReserved1 = 0;
pOemPDEV->bmFileHeader.bfReserved2 = 0;
pOemPDEV->bmFileHeader.bfOffBits = pOemPDEV->cbHeaderOffBits;
// Offset to bits in file.
if (pOemPDEV->bColorTable)
pOemPDEV->bmFileHeader.bfOffBits += pOemPDEV->cPalColors *
sizeof(ULONG);
// Num of scanlines
//
cScans = pOemPDEV->bmInfoHeader.biHeight;
// Flip the biHeight member so that it denotes top-down bitmap
//
pOemPDEV->bmInfoHeader.biHeight = cScans * -1;
//Write the Bitmap Array to the File.
//write File Header Information
byte *bytes = new byte[sizeof(BITMAPFILEHEADER)];
memcpy(bytes,(void*)&(pOemPDEV->bmFileHeader),sizeof(BITMAPFILEHEADER));
//::WriteFile(objEndFileHandle,(void*)&(pOemPDEV->bmFileHeader),sizeof(BITMAPFILEHEADER),ByteWritten,NULL);
::WriteFile(objEndFileHandle,(void*)bytes,sizeof(BITMAPFILEHEADER),ByteWritten,NULL);
oError = GetLastError();
if(oError != 0)
::MessageBox(NULL,(LPCTSTR)“Error writing file Header”,(LPCTSTR)“Error”,MB_OK);
//write Bitmap Header Information
byte *Hbytes = new byte[sizeof(BITMAPINFOHEADER)];
memcpy(Hbytes,(void*)&(pOemPDEV->bmInfoHeader),sizeof(BITMAPINFOHEADER));
::WriteFile(objEndFileHandle,(void*)Hbytes,sizeof(BITMAPINFOHEADER),ByteWritten, NULL);
oError = GetLastError();
if(oError != 0)
::MessageBox(NULL,_T(“Error writing bmInfoHeader Header”),(LPCTSTR)“Error”,MB_OK);
//Bitmap header files written bytes Written
if (pOemPDEV->bColorTable)
{
byte *colorbytes = new byte[pOemPDEV->cPalColors *
sizeof(ULONG)];
memcpy(colorbytes,(void*)&(pOemPDEV->bmInfoHeader),pOemPDEV->cPalColors
* sizeof(ULONG));
//::WriteFile(objEndFileHandle,(void*)&(pOemPDEV->prgbq),
//pOemPDEV->cPalColors * sizeof(ULONG),ByteWritten,NULL);
::WriteFile(objEndFileHandle,(void*)colorbytes,pOemPDEV->cPalColors*sizeof(ULONG),ByteWritten,NULL);
oError = GetLastError();
if(oError != 0)
::MessageBox(NULL,_T(“Error writing bmHeader Header”),(LPCTSTR)“Error”,MB_OK);
}
//write Image Data
::WriteFile(objEndFileHandle,pOemPDEV->pBufStart,pOemPDEV->bmInfoHeader.biSizeImage,ByteWritten,NULL);
oError = GetLastError();
if(oError != 0)
::MessageBox(NULL,_T(“Error in Writing BufferInformation”), (LPCTSTR)“3”, MB_OK);
CloseHandle(objEndFileHandle);
if (pOemPDEV->bColorTable)
{
if((oError = GetLastError()) != 0)
{
LPCTSTR strError = ConvertToString(oError);
::MessageBox(NULL,strError,_T(“Color Transformation Error ID”),MB_OK);
}
}
vFreeBuffer(pOemPDEV);
}
oError = GetLastError();
//return to unidrv
pOemPDEV->bmInfoHeader.biHeight = 0;
pOemPDEV->bmInfoHeader.biSizeImage = 0;
pOemPDEV->bHeadersFilled = 0;
return (pOemPDEV->m_pfnDrvSendPage)(pso);
}