﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>StrataFrame Forum » .NET Forums » General .NET Discussion  » Is the printer ready ?</title><generator>InstantForum 2017-1 Final</generator><description>StrataFrame Forum</description><link>http://forum.strataframe.net/</link><webMaster>StrataFrame Forum</webMaster><lastBuildDate>Tue, 09 Jun 2026 04:36:53 GMT</lastBuildDate><ttl>20</ttl><item><title>Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17151.aspx</link><description>This sound like it should be easy but it isn't.&amp;nbsp; I need to find out from with a VFP app if a particular printer is ready to print.&amp;nbsp;i.e it's current status&amp;nbsp;&amp;nbsp;(Ready, out of paper, off-line whatever)&amp;nbsp; This code, offered up on&amp;nbsp; Universal Thread, doesn't work because if the printer is installed the handle will happen successfully (assuming the printer server box is on line) no matter what the &lt;U&gt;status&lt;/U&gt; of the printer is. &lt;/P&gt;&lt;P&gt;(code below is a VFP function with syntax adjusted from VB)&lt;/P&gt;&lt;P&gt;[codesnippet]&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;/P&gt;&lt;P&gt;LPARAMETERS &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;tcprintername&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;P&gt;&amp;amp;&amp;amp;#DEFINE cJobs_OFFSET 77&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;DECLARE INTEGER &lt;/FONT&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;OpenPrinter &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;IN &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;winspool.drv;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;STRING &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;pPrinterName, &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;INTEGER &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;@phPrinter, &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;INTEGER &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;pDefault&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;DECLARE INTEGER &lt;/FONT&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;ClosePrinter &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;IN &lt;/FONT&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;winspool.drv &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;INTEGER &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;hPrinter &lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;cPrinter=tcprintername&lt;/P&gt;&lt;P&gt;hPrinter=0&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;IF &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;OpenPrinter(m.cPrinter, @hPrinter, 0) = 0&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&amp;amp;&amp;amp;? "Unable to obtain handle for the printer."&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;RETURN &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;-1&lt;/FONT&gt;&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;ENDIF&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;P&gt;= ClosePrinter(hPrinter)&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;RETURN &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;0&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;[/codesnippet]&lt;/P&gt;&lt;P&gt;I found this &lt;A href="http://www.merrioncomputing.com/Programming/PrintStatus.htm"&gt;http://www.merrioncomputing.com/Programming/PrintStatus.htm&lt;/A&gt;&amp;nbsp;and I think my answer for creating a dll in .net may be in here but putting it together is a little beyound my current understanding of how these pieces fit.&lt;/P&gt;&lt;P&gt;Anyone who has solved this, knows of a third party dll that can be obtained or purchased, or who has already invented this wheel - you guidance will be greatly appreciated.&lt;/P&gt;&lt;P&gt;Charles</description><pubDate>Thu, 19 Jun 2008 12:55:46 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17185.aspx</link><description>Glad it helped! :)</description><pubDate>Thu, 19 Jun 2008 12:55:46 GMT</pubDate><dc:creator>Trent L. Taylor</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17184.aspx</link><description>Hey, thanks an lot Edhy and Trent.&amp;nbsp; i'm really glad I asked!&amp;nbsp; I had actually forgotten that by using a .NET dll I would have to make sure the boxes that ran it had .NET but since this is a feature that is going into an app we are converting to a SQLExpress backend I believe that will insure that .NET is there, no?&lt;/P&gt;&lt;P&gt;In any case, this is helping a lot in clarifying my understanding of how to do this stuff.&amp;nbsp; I knew that winmgmts was the old approach but couldn't wrap my brain around how to use the wmi.&lt;/P&gt;&lt;P&gt;It is great to be learning .NET in an environment where people speak Fox.&amp;nbsp; (I have been talking up Strataframe big-time on the UT for exactly that reason)&lt;/P&gt;&lt;P&gt;Both of your posts are going in the scrapbook and I'm definitely going to be making good use of this.&amp;nbsp; Thanks again.</description><pubDate>Thu, 19 Jun 2008 12:36:21 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17177.aspx</link><description>Thanks, that did it!</description><pubDate>Thu, 19 Jun 2008 10:49:34 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17174.aspx</link><description>Add SYstem.Management as a reference.</description><pubDate>Thu, 19 Jun 2008 10:39:06 GMT</pubDate><dc:creator>Trent L. Taylor</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17173.aspx</link><description>Hi Trent,&lt;/P&gt;&lt;P&gt;I am trying to test/implement your code above, but I am getting some missing references:&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;ConnectionOptions()&lt;/LI&gt;&lt;LI&gt;System.Management.ManagementScope()&lt;/LI&gt;&lt;LI&gt;System.Management.ObjectQuery()&lt;/LI&gt;&lt;LI&gt;ManagementObjectCollection&lt;/LI&gt;&lt;LI&gt;ManagementObjectSearcher()&lt;/LI&gt;&lt;LI&gt;ManagementObject&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Could you please tell us what is the missing reference assembly?</description><pubDate>Thu, 19 Jun 2008 10:38:01 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17167.aspx</link><description>We have several .NET assembleis that we setup as COM and allow access through VFP.&amp;nbsp; We had to in order to allow our older VFP stuff run at the same time as out .NET stuff.&amp;nbsp; In fact, we actually have our VFP EXE running inside of our .NET app so people don't even know that a VFP app is running inside of the .NET app...it just feels like one application.&lt;/P&gt;&lt;P&gt;At any rate, like Edhy mentioned, WMI is a good way to go, but you want to be careful about using the winmgmts:// approach.&amp;nbsp; If you recall, in VFP you pretty much had no choice, this is what you had to do.&amp;nbsp; But now, in .NET, we can take safer approach and not rely on that instance.&amp;nbsp; Here is a class that will return to you the state of the printer using WMI:&lt;/P&gt;&lt;P&gt;[codesnippet]Imports System.Management&lt;/P&gt;&lt;P&gt;Public NotInheritable Class Printers&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Available printer states (that I have figured out, anyway)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Enum PrinterStates As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Online = 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LidOpen = 4194432&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutOfPaper = 144&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; OutOfPaperLidOpen = 4194448&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Printing = 1024&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Initializing = 32768&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ManualFeedInProgress = 160&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Offline = 4096&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Unknown = -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Enum&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' Determine the state for a printer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;/summary&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;param name="printerName"&amp;gt;&amp;lt;/param&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ''' &amp;lt;remarks&amp;gt;&amp;lt;/remarks&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Public Shared Function GetPrinterStatus(ByVal printerName As String) As PrinterStates&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Establish Locals&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oConn As New ConnectionOptions()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oMS As New System.Management.ManagementScope("\root\CIMV2", oConn)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Dim oQuery As New System.Management.ObjectQuery("select PrinterState from Win32_Printer where Name = """ &amp;amp; printerName &amp;amp; """")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oQuery As New System.Management.ObjectQuery("SELECT * FROM Win32_Printer WHERE Name = """ &amp;amp; printerName &amp;amp; """")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oSearcher As ManagementObjectSearcher&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim oReturnCollection As ManagementObjectCollection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim r As PrinterStates&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Execute the query&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oSearcher = New ManagementObjectSearcher(oMS, oQuery)&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Now get the results of the query&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oReturnCollection = oSearcher.Get()&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Cycle through the results&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each oPrinter As ManagementObject In oReturnCollection&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Make sure that there is a match on the name of the printer.&amp;nbsp; This should have already been addressed&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&amp;nbsp;&amp;nbsp; as part of the query, but better safe than sorry.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not CType(oPrinter.Item("Name"), String).Equals(printerName, StringComparison.OrdinalIgnoreCase) Then Continue For&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- First determine if the printer is online.&amp;nbsp; This is required because the PrinterState doesn't always&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '&amp;nbsp;&amp;nbsp; accurately return an Offline state.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If CType(oPrinter.Item("WorkOffline"), Boolean) Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = PrinterStates.Offline&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Otherwise, return the state of the printer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = CType(CType(oPrinter.Item("PrinterState"), Integer), PrinterStates)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As Exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; r = PrinterStates.Unknown&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- One we make it this far, then we can bail&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit For&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; '-- Return the results&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return r&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/P&gt;&lt;P&gt;End Class&lt;BR&gt;[/codesnippet]&lt;/P&gt;&lt;P&gt;Then you can just call the method on the desired printer.&amp;nbsp; Here is a quick sample of how to use this:&lt;/P&gt;&lt;P&gt;[codesnippet]For Each printer As String In System.Drawing.Printing.PrinterSettings.InstalledPrinters&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(printer &amp;amp; ControlChars.CrLf &amp;amp; Printers.GetPrinterStatus(printer).ToString())&lt;BR&gt;Next[/codesnippet]</description><pubDate>Thu, 19 Jun 2008 10:01:11 GMT</pubDate><dc:creator>Trent L. Taylor</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17165.aspx</link><description>Hi Charles, &lt;P&gt;Oh, I did not understood you wanted to make this a .dll to be used in VFP.&amp;nbsp; I have done that for a library I use in one of my VFP project and you will need to do some registration on every computer this .dll will be use: &lt;UL&gt;&lt;LI&gt;In your MyProject Compile page, check the "Register for COM interop" option.&amp;nbsp; That will make your library available to be use as a COM object in VFP.&lt;/LI&gt;&lt;LI&gt;You will need to have the .Net runtime installed in each computer this library will be used.&lt;/LI&gt;&lt;LI&gt;You need to Register this library using the RegAsm.exe utility so it can be seen by the VFP application.&amp;nbsp; The code to register it will be something like this:&lt;/LI&gt;&lt;UL&gt;&lt;LI&gt;RegAsm.exe MyLibraryName.dll /silent &lt;STRONG&gt;/codebase&lt;/STRONG&gt;&lt;/LI&gt;&lt;LI&gt;The codebase parameter is very important since without it your VFP will not be able to see the COM classes.&amp;nbsp; What I did was to include a copy of RegAsm.exe with my application and copied to the same folder where the library is installed and then created a batch file with above code to register the library and it worked just fine.&lt;/LI&gt;&lt;/UL&gt;&lt;/UL&gt;&lt;P&gt;There are many sample code in goggle on how to make a .NET library as COM, and it is basically pretty easy, then in your VFP application you will create the COM object like this:&lt;/P&gt;&lt;P&gt;[quote][codesnippet]&lt;B&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;/P&gt;&lt;P&gt;** This is a VFP Code....&lt;/P&gt;&lt;P&gt;TRY&lt;/P&gt;&lt;/B&gt;&lt;P&gt;&lt;B&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LOCAL &lt;/FONT&gt;&lt;FONT face="Courier New" color=#000000 size=2&gt;loPrinterStatusLib &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;AS &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;&lt;FONT face="Courier New" size=2&gt;AssemblyName.className&lt;/P&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/B&gt;&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;loPrinterStatusLib = &lt;/FONT&gt;&lt;B&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;CREATEOBJECT&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;("AssemblyName.className")&lt;/P&gt;&lt;/B&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; IF VARTYPE&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;(loPrinterStatusLib) = "O"&lt;/P&gt;&lt;/B&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#008000 size=2&gt;&lt;STRONG&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/STRONG&gt;* Add your code here...&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ENDIF&lt;/P&gt;&lt;/B&gt;&lt;B&gt;&lt;P&gt;CATCH TO &lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;&lt;FONT color=#000000&gt;oX&lt;/FONT&gt;&lt;/P&gt;&lt;/B&gt;&lt;P&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;B&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MESSAGEBOX&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;("Printer Status Library Failed." + &lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;CHR&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;(13) + ox.&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;MESSAGE&lt;/FONT&gt;&lt;FONT face="Courier New" size=2&gt;, 64, "Printer Status Check...")&lt;/P&gt;&lt;/FONT&gt;&lt;FONT face="Courier New" color=#0000ff size=2&gt;&lt;P&gt;ENDTRY&lt;/P&gt;&lt;P&gt;&lt;/B&gt;&lt;/FONT&gt;[/codesnippet][/quote]</description><pubDate>Thu, 19 Jun 2008 09:03:10 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17160.aspx</link><description>Thanks &lt;U&gt;very&lt;/U&gt; much Edhy.&amp;nbsp; That did indeed get me started.&amp;nbsp; I think I can figure out from here how to find the printer I want in the collection and then I need to figure out how to make this a dll I can call from VFP with the param of the name of the printer I want and return a value for it's status.&amp;nbsp; I know that is just basic .net stuff I should learn anyway so this is a good chance to figure it out on a very simple scenario.&lt;/P&gt;&lt;P&gt;Thanks again.&amp;nbsp; I'll share results here for anyone interested.</description><pubDate>Wed, 18 Jun 2008 23:28:48 GMT</pubDate><dc:creator>Charles R Hankey</dc:creator></item><item><title>RE: Is the printer ready ?</title><link>http://forum.strataframe.net/FindPost17155.aspx</link><description>Hi Charles,&lt;/P&gt;&lt;P&gt;I found the code below in google &lt;A href="http://bytes.com/forum/thread351305.html"&gt;http://bytes.com/forum/thread351305.html&lt;/A&gt;&lt;/P&gt;&lt;P&gt;[quote][codesnippet]&lt;FONT size=2&gt;&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Enum&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatus&lt;/P&gt;&lt;P&gt;PrinterIdle = 3&lt;/P&gt;&lt;P&gt;PrinterPrinting = 4&lt;/P&gt;&lt;P&gt;PrinterWarmingUp = 5&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#008000 size=2&gt;' For more states see WMI docs.&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Enum&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatusToString(&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; ps &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatus) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; s &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Select&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Case&lt;/FONT&gt;&lt;FONT size=2&gt; ps&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Case&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatus.PrinterIdle&lt;/P&gt;&lt;P&gt;s = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"waiting (idle)"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Case&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatus.PrinterPrinting&lt;/P&gt;&lt;P&gt;s = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"printing"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Case&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterStatus.PrinterWarmingUp&lt;/P&gt;&lt;P&gt;s = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"warming up"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Case&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Else&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;s = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"unknown state"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Select&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;PrinterStatusToString = s&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Function&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Private&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/FONT&gt;&lt;FONT size=2&gt; Form1_Load( _&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; sender &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; System.Object, _&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;ByVal&lt;/FONT&gt;&lt;FONT size=2&gt; e &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; System.EventArgs _&lt;/P&gt;&lt;P&gt;) &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Handles&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;MyBase&lt;/FONT&gt;&lt;FONT size=2&gt;.Load&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; strPrintServer &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;strPrintServer = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"localhost"&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Dim&lt;/FONT&gt;&lt;FONT size=2&gt; WMIObject &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;String&lt;/FONT&gt;&lt;FONT size=2&gt;, PrinterSet &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Object&lt;/FONT&gt;&lt;FONT size=2&gt;, Printer &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;As&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Object&lt;/P&gt;&lt;/FONT&gt;&lt;FONT size=2&gt;&lt;P&gt;WMIObject = &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"winmgmts://"&lt;/FONT&gt;&lt;FONT size=2&gt; &amp;amp; strPrintServer&lt;/P&gt;&lt;P&gt;PrinterSet = GetObject(WMIObject).InstancesOf(&lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;"win32_Printer"&lt;/FONT&gt;&lt;FONT size=2&gt;)&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;For&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Each&lt;/FONT&gt;&lt;FONT size=2&gt; Printer &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;In&lt;/FONT&gt;&lt;FONT size=2&gt; PrinterSet&lt;/P&gt;&lt;P&gt;MsgBox( _&lt;/P&gt;&lt;P&gt;Printer.Name &amp;amp; &lt;/FONT&gt;&lt;FONT color=#a31515 size=2&gt;": "&lt;/FONT&gt;&lt;FONT size=2&gt; &amp;amp; _&lt;/P&gt;&lt;P&gt;PrinterStatusToString(Printer.PrinterStatus) _&lt;/P&gt;&lt;P&gt;)&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Next&lt;/FONT&gt;&lt;FONT size=2&gt; Printer&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;End&lt;/FONT&gt;&lt;FONT size=2&gt; &lt;/FONT&gt;&lt;FONT color=#0000ff size=2&gt;Sub&lt;/P&gt;&lt;P&gt;&lt;/FONT&gt;[/codesnippet][/quote]&lt;/P&gt;&lt;P&gt;Copy the above code to an empty form and test the result.&amp;nbsp; I don't know if this is the best way to deal with this, but it may get you started.</description><pubDate>Wed, 18 Jun 2008 17:58:48 GMT</pubDate><dc:creator>Edhy Rijo</dc:creator></item></channel></rss>