Using standard printing from windows

CodeGuru content and product recommendations are editorially independent. We may make money when you click on links to our partners. Learn More.

There are many applications where I don’t really want to use the usual
windows page print. Instead I want output to go directly to the printer
using
standard print i/o. It’s actually a topic that is hard to find in any
of the
books on Windows, at least I’ve never found anything on it. But to my
surprise
I recently learned that standard (DOS/UNIX) printing is alive and well
underneath windows. All we need to do is open a printer port and print
to it.

If the printer is directly attached to the computer it’s trivial. The
method
for obtaining a printer port when the printer is on the network isn’t
hard
either.

The example below shows how I use the Windows NET USE command to
re-direct
LPT1 to a shared printer on an NT Server. The same technique applies
for
Novell networks with a slightly different syntax.

Try this out by creating a new MFC Form-based project. Put a button on
the
form and attach this code to it. You can actually print with only 3
lines of code:


        FILE *fp = fopen("LPT1", "w");
        fprintf(fp,"What's up, Doc?n");
        fclose(fp);

Instant print gratification!!

While the program is open it hogs the printer port. In my shop that
isn’t a
problem but be aware of the effect on your windows spooled output.


      *********************************************************
                        THE CODE
      *********************************************************

// the headers for the conventional i/o routines
#include 
#include 
#include 

using namespace std;      // makes string and ofstream
                          // work without std:: qualifier

void CLineprtView::OnButton1()
{
    // I could have used a CString instead of the buff[]
    // but I wanted to show how this is used with lightweight
    // ATL code and STD library

    char buff[MAX_BUFF_SIZE];

    // My printer is located on another server so I must re-direct the
    // printer port.  If the printer is directly attached this extra step
    // is not needed.
    // on my network the printer is published as \GREENhp5annex
    // All those back-slashes escape the backslash in the path name

    if (PRINTER_IS_REMOTE)
    {
        system("NET USE LPT1 /d");  // free up the port
        system("net use lpt1 \\green\hp5annex");
    }

    // old fashioned file handle with
    // old fashioned open of the printer port
    FILE *ptr = fopen("LPT1","w");

    // laser printer setup string
    sprintf(buff,"33E33(s0p4102t1b16.66H33&l1O");
    fprintf(ptr,buff);

    // old fashioned print
    fprintf(ptr,"Who of late doth make a thimble.n");
    fprintf(ptr,"Is a lower bunk a status symbol??n");

    // old fashioned close
    fclose(ptr);

    // now the same thing with stream io
    ofstream optr("LPT1", ios::out);

    string str_text = "Hey Doc, Ain't this a print test from windowsn";
    str_text += "with more lines to follow?n";

    optr << str_text << endl;
    optr << "Quiet, wabbit. I'm conversing with my muse!!n";

    optr << "That's all folks." << "f" << flush;     // add a formfeed

    // the printer connection is still open so close it
    optr.close();

    // drop the network link
    if (PRINTER_IS_REMOTE)
    {
        system("net use lpt1 /d");
    }
}

In practice I get printer path information from the registry on each
machine, so the real live code is a little busier than this example, but
not much.

More by Author

Get the Free Newsletter!

Subscribe to Developer Insider for top news, trends & analysis

Must Read