Question

Detecting if a printer is installed

Asked by: darkrain

I am trying to trap an error in some code that crashes if the suer does not have a printer installed. I have used the on error function to capture it, but if i then unload the form i get another error say it canot unload this context. So instead I want to check if there is a printer installed, if there is then this form can continue to run, otherwise display a message box with only the vbOk button telling of the error and then returning back to the main form.

ie click Report goes to report form and say is there a printer installed yes / no

if yes continue with execution and display the report

else

display message that a printer needs to be installed and wait for ok to be clicked
ok clicked return to main form and allow normall operation again.

if Report is clicked again the same happens.

I hope i have explained what i am trying to achive

thanks in advance.

This Question has been solved and asker verified All Experts Exchange premium technology solutions are available to subscription members.

Subscribe now for full access to Experts Exchange and get

Instant Access to this Solution

  • Plus...
  • 30 Day FREE access, no risk, no obligation
  • Collaborate with the world's top tech experts
  • Unlimited access to our exclusive solution database
  • Never be left without tech help again

Subscribe Now

Asked On
2003-09-29 at 04:29:48ID20751634
Tags

printer

,

detecting

Topic

Visual Basic Programming

Participating Experts
6
Points
300
Comments
7

Trusted by hundreds of thousands everyday for fast, accurate and reliable tech support.

  • "The time we save is the biggest benefit of Experts Exchange to Warner Bros. What could take multiple guys 2 hours or more each to find is accessed in around 15 minutes on Experts Exchange." Mike Kapnisakis, Warner Bros.
  • "Our team likes having a resource that is more secure than just using Google and most experts using this service really know their stuff. It's nice to look here first versus using Google." Dayna Sellner, Lockheed Martin
  • "Anytime that I've been stumped with a problem, 9 out of 10 times Experts Exchange has either the accepted solution or an open discussion of the potential solution to the problem." Kenny Red, eBay Inc.

See what Experts Exchange can do for you.

Got a question?

We've got the answer.

Experts Exchange has been collecting answers to technology questions since 1996…3 million and counting! If you have a question, chances are we already have your answer.

Screenshot of Experts Exchange Knowledgebase

Need individual assistance?

Our experts are ready to help.

If you can't find the exact answer you're looking for, ask our exclusive community of 50,000 experts. You’ll get a personalized answer from a trusted professional.

Screenshot of Experts Exchange Knowledgebase

Want to learn from the best?

Read articles from industry experts.

Thousands of free tech tips, tricks, how-to’s and tutorials are available in our peer reviewed articles section. See for yourself how smart our experts are, no login required.

Screenshot of an Article

Working on a long term project?

Store your work and research.

Save solutions to your questions, answers you’ve discovered through searching plus helpful articles in your personal knowledgebase for easy future access.

Screenshot of Experts Exchange Knowledgebase

Access the answers to your technology questions today.

Subscribe Now

30-day free trial. Register in 60 seconds.

What Makes Experts Exchange Unique?

Members of the expert community talk about why the experience at Experts Exchange is different than what you will find anywhere else.

Trusted by the world's most respected brands.

image of each brand's logo

Faithfully serving IT professionals since 1996.

Experts Exchange Logo

Try it out and discover for yourself.

Subscribe Now

30-day free trial. Register in 60 seconds.

Related Solutions

  1. Trap, Trap, Trap
    Hi! I get many traps on a system with Warp 4 installed. I cannot seem to isolate the causes, but sometimes it happens when the system is simply "sitting there" The problem, whether trap c,d,e,6 (most common) usuallly occurs at ##0160:fff54c8c. Does this mean ...
  2. trapping printer errors
    I am able to print the files in visual basic 5.0, but my problem is to trap the printer error and pass it to a log file. Here I am facing problem in capturing the printer error ,if suppose printer is offline,no ink,out of paper,paper jam etc.. Please help me to solve this.
  3. Unload from Load
    What is the best way of breaking the process of form loading if I detect some kind of error in the middle of the loading and don't want to show form at all? Apolo.
  4. Trap the Enter Key
    I have pgm. with many controls. The user can use the keyboard. I use KeyPreview to trap the keys BUTTTTTT i'm not able to trap the Enter Key. How can i do it?
  5. printer detect
    i bought a 2nd hand pc with intel pentium,processor 166mhz with edo ram 32MB which install with win98 cannot detect my old printer. The printer is HP Hewlett 5L laser printer.this pc i dont't have any driver cd like sound card or display card.So i don't want to format it and ...
  6. Trap Window Unload Event
    How do I trap window unload event in both IE and Netscape? I need to show an alert message when the browser is closed. 1) Onunload="function();" works fine in body tag if run from IE, but not in netscape. 2) Even, window.onunload=function name; works perfectly in ...

Free Tech Articles

  1. WARNING: 5 Reasons why you should NEVER fix a computer for free.
    It is in our nature to love the puzzle. We are obsessed. The lot of us. We love puzzles. We love the challenge. We thrive on finding the answer. We hate disarray. It bothers us deep in our soul. W...
  2. SCCM OSD Basic troubleshooting
    SCCM 2007 OSD is a fantastic way to deploy operating systems, however, like most things SCCM issues can sometimes be difficult to resolve due to the sheer volume of logs to sift through and the dispe...
  3. Migrate Small Business Server 2003 to Exchange 2010 and Windows 2008 R2
    This guide is intended to provide step by step instructions on how to migrate from Small Business Server 2003 to Windows 2008 R2 with Exchange 2010. For this migration to work you will need the fo...
  4. Create a Win7 Gadget
    This article shows you how to create a simple "Gadget" -- a sort of mini-application supported by Windows 7 and Vista. Gadgets can be dropped anywhere on the desktop to provide instant information, ...
  5. Outlook continually prompting for username and password
    There have been a lot of questions recently regarding Outlook prompting for a username and password whilst using Exchange 2007. There are a few reasons why this would happen and I will try to cover t...
  6. Backup Exchange 2010 Information Store using Windows Backup
    There seems to be quite a lot of confusion around the ability to backup Exchange 2010 using the built in Windows Backup feature. This stems from the omission of this feature prior to Exchange 2007 s...

Cloud Class Webinars

  1. Avoiding Bugs in Microsoft Access
    Alison Balter takes and in-depth look at avoiding bugs in Access. In this webinar you will learn about using the immediate window to debug your applications, invoking the debugger, using breakpoints to troubleshoot, stepping through code, setting the next statement to execute, ...
  2. Top 10 Best New Features in Visio 2010
    Scott Helmers gives live demonstrations of the top 10 new features in Visio 2010. This webinar will teach you how to create compelling diagrams by adding shapes to the page with a single click, linking the shapes in a diagram to data in Excel (or SQL Server, or SharePoint), ...
  3. IT Consultant Business Secrets Revealed
    Michael Munger, Experts Exchange tech pro and IT consultant, pulls back the curtain on his very successful businesses and answers question on every IT consultant and business owner should know about. He shares secrets on what he did to solve the 5 most common problems in IT, ...
  4. Disaster Recovery and Business Continuity
    Quest CTO, Mike Billon, gives an overview of the steps involved in building a dunamic disaster recovery plan. Through case studies and an examination of software/hardware tooles for monitoring and testing, you'll gain a better understandin of where you are, where you want ...
  5. Organize Your Visio Diagrams with Containers and Lists
    Scott Helmers uses cross functional flowcharts, wireframe diagrams, data graphic legends and seating charts to teach you: how to ustilize all three new structured diagram components in Visio 2010, the best practices for organizeing shapes in previous version of Visio, how to organize ...
  6. How to Us Objects, Properties, Events and Methods in Microsoft Access
    Alison Dalter gives an in-depbth look at objects, properties, events and methods in Microsoft Access. In this webinar you will learn about using the object browser, referring to objects, working with properties and methods, working with object variables, understanding the ...

Join the Community

Give a Little. Get a Lot.

Join the community of experts here and help other tech pros by answering question in your area of expertise. You can earn FREE access to all Experts Exchange's premium features and resources.

Join the Community

Answers

 

by: TimCotteePosted on 2003-09-29 at 04:34:04ID: 9450533

Hi darkrain,

This example uses some api calls to enumerate locally installed printers. You could modify this to simply return a count of the printers installed and use the existing If statement that checks for more than one to show your message box error.

' Get information about all of the local printers using structure 1.  Note how
' the elements of the array are loaded into an array of data structures manually.  Also
' note how the following special declares must be used to allow numeric string pointers
' to be used in place of strings:
Private Declare Function lstrcpy Lib "kernel32.dll" Alias "lstrcpyA" (ByVal lpString1 As String, ByVal lpString2 As Long) As Long
Private Declare Function lstrlen Lib "kernel32.dll" Alias "lstrlenA" (ByVal lpString As Long) As Long
Private Declare Function EnumPrinters Lib "winspool.drv" Alias "EnumPrintersA" (ByVal flags As Long, ByVal name As String, ByVal Level As Long, pPrinterEnum As Long, ByVal cdBuf As Long, pcbNeeded As Long, pcReturned As Long) As Long
Const PRINTER_ENUM_LOCAL = &H2
Private Type PRINTER_INFO_1
        flags As Long
        pDescription As String
        pName As String
        pComment As String
End Type
Private Sub Form_Load()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    Dim longbuffer() As Long  ' resizable array receives information from the function
    Dim printinfo() As PRINTER_INFO_1  ' values inside longbuffer() will be put into here
    Dim numbytes As Long  ' size in bytes of longbuffer()
    Dim numneeded As Long  ' receives number of bytes necessary if longbuffer() is too small
    Dim numprinters As Long  ' receives number of printers found
    Dim c As Integer, retval As Long  ' counter variable & return value
    Me.AutoRedraw = True 'Set current graphic mode to persistent
    ' Get information about the local printers
    numbytes = 3076  ' should be sufficiently big, but it may not be
    ReDim longbuffer(0 To numbytes / 4) As Long  ' resize array -- note how 1 Long = 4 bytes
    retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
    If retval = 0 Then  ' try enlarging longbuffer() to receive all necessary information
        numbytes = numneeded
        ReDim longbuffer(0 To numbytes / 4) As Long  ' make it large enough
        retval = EnumPrinters(PRINTER_ENUM_LOCAL, "", 1, longbuffer(0), numbytes, numneeded, numprinters)
        If retval = 0 Then ' failed again!
            Debug.Print "Could not successfully enumerate the printes."
        End  ' abort program
    End If
    End If
    ' Convert longbuffer() data into printinfo()
    If numprinters <> 0 Then ReDim printinfo(0 To numprinters - 1) As PRINTER_INFO_1 ' room for each printer
    For c = 0 To numprinters - 1  ' loop, putting each set of information into each element
        ' longbuffer(4 * c) = .flags, longbuffer(4 * c + 1) = .pDescription, etc.
        ' For each string, the string is first buffered to provide enough room, and then the string is copied.
        printinfo(c).flags = longbuffer(4 * c)
        printinfo(c).pDescription = Space(lstrlen(longbuffer(4 * c + 1)))
        retval = lstrcpy(printinfo(c).pDescription, longbuffer(4 * c + 1))
        printinfo(c).pName = Space(lstrlen(longbuffer(4 * c + 2)))
        retval = lstrcpy(printinfo(c).pName, longbuffer(4 * c + 2))
        printinfo(c).pComment = Space(lstrlen(longbuffer(4 * c + 3)))
        retval = lstrcpy(printinfo(c).pComment, longbuffer(4 * c + 3))
    Next c
    ' Display name of each printer
    For c = 0 To numprinters - 1
        Me.Print "Name of printer"; c + 1; " is: "; printinfo(c).pName
    Next c
End Sub


Tim Cottee MCSD, MCDBA, CPIM
Brainbench MVP for Visual Basic
http://www.brainbench.com

 

by: ryancysPosted on 2003-09-29 at 04:34:42ID: 9450534

See:
 
Enumerating Local and Network Printers
http://www.mvps.org/vbnet/code/enums/enumprinters.htm and its related links.

 

by: rdrunnerPosted on 2003-09-29 at 05:14:55ID: 9450716

Try this simple solution

if printers.count = 0 then
    msgbox "Hey you need to install a printer..."
    exit sub
end if

 

by: bhagyeshtPosted on 2003-09-29 at 06:10:52ID: 9451123

rdrunner  is the simplest

 

by: pg_indiaPosted on 2003-09-29 at 07:06:15ID: 9451592

Public Function PrinterInstalled() As Boolean

    On Error Resume Next
   
    Dim strDummy As String
    strDummy = Printer.DeviceName
   
    If Err.Number Then
        PrinterInstalled = False
    Else
        PrinterInstalled = True
    End If
   
End Function

 

by: rajaamirapuPosted on 2003-09-29 at 07:11:36ID: 9451627

Use this code
Public Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long

Public Function PrintersExist() As Boolean
    On Error GoTo err_hand
    Dim strDef As String
    Dim strDi As String
    strDef = Space(128)
    strDi = GetProfileString("WINDOWS", "DEVICE", "", strDef, 127)
    If strDi = "0" Then
        PrintersExist = False
    Else
        PrintersExist = True
    End If
Exit Function
err_hand:
    PrintersExist = False
    Exit Function
End Function

 

by: darkrainPosted on 2003-09-29 at 10:10:36ID: 9452895

Thanks to all that have given up there time to help.

Rdrunners solution worked perfectly.

20120131-EE-VQP-002

3 Ways to Join

30-Day Free Trial

The Experts

98% positive feedback on 31,087 answers since March 2000. angeliii is a Microsoft Most Valuable Professional for his work with MS SQL Server & Develoment.

He has also proven his knowledge of Visual Basic Programming, PHP Scripting and Oracle Databases.

The Experts

97% positive feedback on 10,752 answers since July 2000. lrmoore has more than 18 years experience in the networking industry.

The six-time Mircosoft MVPs specialties include firewalls, virtual private networking, and network management.

Testimonials

"...and excellent source for support... Kind of like having your very own IT dept." Electriciansnet

Testimonials

"I was apprehensive at signing up at first. However... it has already made my life as an IT administrator much easier." JaCrews

Testimonials

"WOW! You guys have great, active, and knowledgeable people on here." moore50

Business Clients

Business Clients

In the Press

"If you’ve got a question... Experts Exchange can supply an answer.”

In the Press

"...an invaluable aid for both IT professionals and those who require tech support."

In the Press

"where IT professionals provide quick answers on just about any topic"

Business Account Plans

Loading Advertisement...