catch EMF in Driver

  • Thread starter Thread starter Thomas Freudenreich
  • Start date Start date
T

Thomas Freudenreich

I've sucessfully wrote (sample) the code to copy the emf-Spoolfiles away in
an printprocessor. Because I needed an modified printerdriver, too I want
to put this code in the printerdriver ( plottersample by microsoft, because
I need a kind of plotterdriver ). I thought a good place where DrvEndDoc (
in the sample in page.c ) but in there the spoolfiles are not finished
(size 0 if debug and look at the spooldirectory). Maybe DrvSendPage. Or is
it impossible to get the emf-output in the printdriver itself ?

Thomas
 
Hi Thomas,

search for PrintMirror at www.sourceforge.net.

You can't get the emf-file in the driver. You have
to write a print processor (sample in ddk) or use the driver-UI
entry-points "DrvDocumentEvent" parameters DOCUMENTEVENT_ENDDOCPOST.
Look at printmirror. It uses emf-files this way.

Dieter
 
Hi Dieter
Danke fuer die hilfreiche Antwort.

In the files I found you did the copying in DOCUMENTEVENT_ENDDOC not
DOCUMENTEVENT_ENDDOCPOST ? Should I change it to DOCUMENTEVENT_ENDDOCPOST ?

And is there a totally different approach ? Maybe the EMF is somewhere in
memory , that we did'nt need to copy files. What is
BOOL ReadPrinter(
HANDLE hPrinter, // handle to printer object
LPVOID pBuf, // data buffer
DWORD cbBuf, // size of data buffer
LPDWORD pNoBytesRead // bytes received
);
doing ? I guess I saw somebody wroting that it gives you the EMF Output.
But by reading the manual it seems to me that this has more the meaning of
reading the physical printer ports ( Busy, Paper Out ...) ?

Thomas
 
Hi Thomas,


I think you can copy the spool file in both calls, since the spooler is
configured not to delete the job (function
CreateWin2kcompatibleSplFile). The problem is to detect the name for the
spool file. Print Mirror uses a ExtEscape-Call to it's own driver to get
the jobid. In DOCUMENTEVENT_ENDDOCPOST the job has perhaps finished
and the driver is not alive any more (so leave it in DOCUMENT_ENDDOC)
Be aware, that parts of the function are called on the client side when
printing (CREATEDC, STARTDOC, ...) and some on the server side
(SENDPAGE, ENDDOC, ...).
Perhaps you can read the EMF-File with ReadPrinter. In printprocessors
this works, but you have to open the printer in a special way. E.g. for
printer "Test" with job "4711" you have to call
OpenPrinter ("Test, Job 4711", ...)
but you have the same problem to get the jobid.

Dieter
 
Hi Dieter
Thanks a lot, if I can put the code in the printerdriver that should be
enough for me.
With clientside you mean the application that prints and serverside is the
spooler which sends the data to the printer ?
I did'nt found any really clear explanation of the printing process.
Sometime ago I wrote a device driver for my company and even in the books
for that, they factor out printerdriver.

Thomas

Am Thu, 19 Oct 2006 22:19:14 +0200 schrieb Dieter:
 
Hi Dieter
Thanks a lot, if I can put the code in the printerdriver that should be
enough for me.
With clientside you mean the application that prints and serverside is the
spooler which sends the data to the printer ?

Yes, with clientside I mean the address space of the printing
application. It's possible to show Dialogs and set breakpoints to debug
the client app (even in TMS environments). "Serverside" is called by the
spooler-process.
I did'nt found any really clear explanation of the printing process.
Sometime ago I wrote a device driver for my company and even in the books
for that, they factor out printerdriver.


Good Luck

Dieter
 
Am Fri, 20 Oct 2006 14:12:49 +0200 schrieb Christoph Lindemann:
This not correct. You can access the data from DrvStartDoc via ReadPrinter.
Please see the follwing page for more info
http://undocprint.printassociates.com/winspool/spool_files

Thank you just read that.
Why I need "RevertToPrinterSelf" ? Did'nt I have the rights to ReadPrinter
inside the DriverCode ( better scurity context of the driver ) ?
I will try this soon because if this work I did'nt need access to the
%Systemroot%.../PRINTER Directory.

Thomas
 
Hi Dieter

I'm trough now. I put some information (JobID etc) in the Devicestruct that
I read later in DOCUMENTEVENT_ENDDOC. Because my Driver is based on
MS-Plotter thats all the I copied from your project.
Except ... I also did CreateWin2kcompatibleSplFile in
DOCUMENTEVENT_CREATEDCPRE. In that you have a PatchIAT and FixUpDevmode ?
What is this for ? The driver works on my machine but I may have to do
something special in other cases that I did'nt know until now. Thats why I
ask.

Next weekend I will give ReadPrinter a try ( see answer from Christoph )

Thomas



Am Fri, 20 Oct 2006 07:48:43 +0200 schrieb Dieter:
 
Hi Thomas,

sorry I don't know what the two functions are for.
(Copies
You have to ask Vivid Aravind, printmirror was developed by him.

When using ReadPrinter check the size of the read data with the size
of the generated spoolfile. I use this function too in a print processor
and there it reads too much data. But perhaps this problems won't occur
in printer driver environment.

Dieter
 
Hi Christoph,

thank you for that tip.
I used another workaround in my printprocessor (I parsed emf page by
page until the number of pages, reported from the jobinfo were reached
and ignored the rest of the data). But I will change it to your idea.
Than the emf parser is independent of additional information.

By the way:
Thank you for the link from your homepage to my splviewer. Many people
use that link.

Dieter
 
Back
Top