Solved

OpenPrinter()gives me Access Violation!!!

Posted on 1998-05-07
8
1,582 Views
Last Modified: 2008-02-01
I'm trying to code an printer log app. My printer is connected to an NT server. I'm using a funktion called FindFirstPrinterChangeNotification and before I can use this funktion I need a handle to my printer. I use the OpenPrinter funktion to get this handle but in return I get 0 wich indicates an error. When I check LastErrorCode the number is 87. My call to OpenPrinter is: BOOL bResult = OpenPrinter(PrinterName ,PrintHandle,&PrinterDefault); where PrinterName is "\\\\server\\printername" and PrinterDefault.DesiredAccess = PRINTER_ALL_ACCESS the rest of the struct is set to NULL. In my debug windows I get this message:
First-chance exception in PrinterLog.exe (WINSPOOL.DRV): 0xC0000005: Access Violation.

Can anybody give me a hint off what is wrong? Nikolaj Christoffersen
0
Comment
Question by:nc
  • 6
  • 2
8 Comments
 
LVL 22

Expert Comment

by:nietod
Comment Utility
I can give you a hint.  error 87 is caused by a bad parameter.  
0
 
LVL 22

Expert Comment

by:nietod
Comment Utility
I see the problem.  You are passing the handle, not a pointer to the handle.
0
 
LVL 22

Expert Comment

by:nietod
Comment Utility
Try

BOOL bResult = OpenPrinter(PrinterName,&PrintHandle,&PrinterDefault)

with a & before the handle.
0
 

Author Comment

by:nc
Comment Utility
>> I can give you a hint.  error 87 is caused by a bad parameter.
You are right the error 87 is a bad parameter but it dosn't solve my Access Violation error and the return value is still 0. Using & before the handle donsn't do anything either. My handle is declared as LPHANDLE if I want to use the & I ned to declare my handle as HANDLE.
0
How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

 
LVL 22

Expert Comment

by:nietod
Comment Utility
I suspect the problem is in how you pass pointers to this procedure.  You declared the PrintHandle as LPHANDLE with is very unusual!  It can be done that way, but it is much harder so you are probably doing it incorrectly.  However, you are probably handling the last parameter PrinterDefault incorrectly as well.   I'll post some code.
0
 
LVL 22

Accepted Solution

by:
nietod earned 110 total points
Comment Utility
When you see a parameter of type LPxxxxx it means window is expecting that the paramamter it gets is a pointer to a xxxxx type that it can access and alter.  It doesn't want to access the pointer, in the end it wants to access the xxxx that it points to.

All three parameter to OpenPrinter() are this way.  

Parameter 1:  Should be a pointer to a string.  This  is easy to do in C++ and you probably got it right.  It could be something like

char PrinterName[] = "\\\\server\\printername";
or
char * PrinterName = "\\\\server\\printername";

Eihter will work because the in both cases PrinterName will be a pointer to a string.  (It doesn't look like it in the first case, but it is).

Parameter 2:  Should point to a HANDLE.  Windows will change the value in the handle.
Thus you have several options.  You could do

HANDLE PrintHandle;

then pass &PrintHandle;  which passes a pointer to the handle that you declared

or you could do  

HANDLE PrintHandle;
LPHANDLE PrintHandlePtr = &PrintHandle;

then pass PrintHandlePtr (no &).  This passes a pointer to PrintHandle.  In either case windows will change PrintHandle.  You CANNOT do

LPHANDLE PrintHandle;

then pass PrintHandle.  Windows will try to change what PrintHandle points to. But you never made it point to anything so it will be poiting to a random location in memory.  This will cause a crash.


0
 
LVL 22

Expert Comment

by:nietod
Comment Utility
Parameter 3:  Must point to a PRINTER_DEFAULTS structure.  Again you can do this several ways.  Thea easiest is

PRINTER_DEFAULTS PrintDefault;

Then pass &PrintDefault.  Or you could do

PRINTER_DEFAULTS PrintDefault;
LPPRINTER_DEFAULTS PrinterDefaultPtr = &PrintDefault;

and then pass PrinterDefaultPtr.  Again, you cannot do

LPPRINTER_DEFAULTS PrintDefault and then pass PrintDefault.  Windows will dereference this pointer and you never made it point to a PRINTER_DEFAULTS for it.

Here is the simplist example.

char * PrinterName = "\\\\server\\printername";
HANDLE PrintHandle;
PRINTER_DEFAULTS PrintDefault;

BOOL bResult = OpenPrinter(PrinterName,&PrintHandle,&PrintDefault);

If this doesn't help, post your code.
0
 

Author Comment

by:nc
Comment Utility
Thank you.
0

Featured Post

Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

Join & Write a Comment

Unlike C#, C++ doesn't have native support for sealing classes (so they cannot be sub-classed). At the cost of a virtual base class pointer it is possible to implement a pseudo sealing mechanism The trick is to virtually inherit from a base class…
Templates For Beginners Or How To Encourage The Compiler To Work For You Introduction This tutorial is targeted at the reader who is, perhaps, familiar with the basics of C++ but would prefer a little slower introduction to the more ad…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will be introduced to the member functions push_back and pop_back of the vector class. The video will teach the difference between the two as well as how to use each one along with its functionality.

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now