Duda en visual FoxPro

<span style="border-collapse: collapse; color: #4a4a4a; font-family: Arial; line-height: 17px;">Tengo un detalle, como puedo saber cuando una impresora de red esta prendida o apagada???? Me pasaron el dato de un codigo el cual utiliza Win32_PrintJob para manipular varias propiedades de la impresora, e revisado el codigo muchas veces pero no puedo hacerlo funcionar, hay otras como Win32_PrinterDriver q si funcionan (muestra datos de tipo de papel, calidad de impresion, oientacion, etc), no se a que se deba, si sea por el windows que utilizo o por la version de FoxPro, manejo la version 8. 
LOCAL lcNameSpace
LOCAL loLocalizador, loServicio, loColaImpresion, loTrabajo
STORE.NULL. TO loLocalizador && Objeto WbemScripting. SWbemLocator para realizar realizar la conexión.
STORE .NULL. TO loServicio && Objeto para aplicar el servicio en base a la conexión.
STORE .NULL. TO loColaImpresion && Objeto con los datos en la cola de impresión.
STORE .NULL. TO loTrabajo && Objeto temporal para realizar el FOR EACH. 
STORE "\root\CIMV2" TO lcNameSpace && Explorar clases del Namespace. 
loLocalizador = CREATEOBJECT( "WbemScripting.SWbemLocator" ) 

* PROCESO PARA REALIZAR LA CONEXIÓN AL PC. 

* Estos son los parámetros necesarios para la conexión. 

* lcPC 
* lcNameSpace 
* lcUsusario 
* lcPassword 

*!* loServicio = loLocalizador.ConnectServer( lcPC, lcNameSpace , lcUsusario, lcPassword ) 

* PARA REALIZAR UNA CONEXIÓN LOCAL, ES DECIR A NUESTRO PC, SERÍA SUFICIENTE CON: 

loServicio = loLocalizador.ConnectServer( ".", lcNameSpace, "", "" ) 

* Una vez conseguida la conexión al PC (Local o Remoto) 

* Debemos de tener en consideración las siguientes asignaciones [1] y [2]: 

* [1] ImpersonationLevel 
* Valor numérico que define el nivel de impersonation del objeto COM. 
* Con esto se determina si los procesos de WMI pueden detectar o usar 
* las credenciales de seguridad al realizar las llamadas a otros procesos. 

loServicio.Security_.impersonationlevel = 3 

* [2] Tareas administrativas. 
* Con esto podemos realizar las tareas administrativas en el Servicio del Spooler. 

loServicio.Security_.Privileges.AddAsString( "SeLoadDriverPrivilege" ) 

* El proceso que realizamos a continuación, nos permitirá enumerar. 
* Para obtener en el retorno, los casos de una clase dada, 
* en nuestro caso, lo realizamos sobre la clase en cuestión "Win32_PrintJob" 

* Resumiendo: Nos retorna una colección en base a la clase dada. 

* A partir de este objeto, podemos realizar el FOR EACH, para listar 
* los trabajos existentes en la cola de impresión (spooler) 

loColaImpresion = loServicio.InstancesOf( "Win32_PrintJob" ) 

*------------------------- 
* Estos datos pueden ser llevados, fácilmente a un CURSOR VFP. 
* Y ser visualizados en un GRID. 
* Podemos ver la estructura de la clase "Win32_PrintJob", en el anexo. 
*------------------------- 

FOR EACH loTrabajo IN loColaImpresion 

WAIT WINDOW "entra" 
? LoTrabajo. JobId
? LoTrabajo. Name
? LoTrabajo. Document
? LoTrabajo. DataType
? LoTrabajo. DriverName
? LoTrabajo. Description
? LoTrabajo. ElapsedTime
? LoTrabajo. HostPrintQueue
? LoTrabajo. JobStatus
? LoTrabajo. Notify
? LoTrabajo. Owner
? LoTrabajo. PagesPrinted
? LoTrabajo. Parameters
? LoTrabajo. Size
? LoTrabajo. StartTime
? LoTrabajo. UntilTime
? LoTrabajo. Status
? LoTrabajo. StatusMask
? LoTrabajo. TimeSubmitted
? LoTrabajo. TotalPages

Endfor
Me comentaban también que puedo utilizar el printstatus(), pero necesito deshabilitar la consola de la cola de impresión, ¿en qué me afecta si hago esto? ¿Qué pasa si no tengo activada la cola de impresión y se mandan documentos al mismo tiempo de varias maquinas? No e intentado probar esta forma porque creo que no es funcional.
¿Conoces algún otro método para manipular la impresora?
¿Qué me recomiendas hacer?
Gracias, espero una respuesta satisfactoria a mis dudas
Atentamente.
Juan Carlos
Ing. Computacion - Area de sistemas </span>

1 Respuesta

Respuesta
1
La función PrintStatus() devuelve .T. si la impresora esta prendida y .F. si no lo esta, ¿el programa que estas desarrollando es para controlar las impresoras? O simplemente deseas saber si la impresora esta prendida, si es lo ultimo simplemente usa PrintStatus antes de emitir el reporte, ahora si deseas más opcioones como indicar a que impresora dirigir el reporte usa PROMPT o GETPRINTER()
Si mi respuesta no es satisfactoria enviame más información sobre el reporte que deseas emitir y así darte una mejor ayuda
Necesito saber cuando una impresora esta encendida o apagada, esto es antes de imprimir un reporte, es solo una impresora, no es necesario que utilice getprinter()
La función printstatus() siempre devuelve .t. y aunque desahabilite la cola de impresión de Windows lo sigue mandando igual. ¿O de que manera hago esto?
¿Conoces alguna otra forma de saber si esta encendida o apagada?
Gracias, de antemano agradezco tu respuesta
En VFP las funciones PrintStatus() y SYS(13) siempre van a devolver que la impresora esta en linea, porque solo miran si existen impresoras, estas funciones se colocan solo por compatibilidad del lenguaje con versiones DOS en donde si devuelven los valores para saber si esta apagada o encendida.
Yo usaba PrintStatus() cuando hacia programas para DOS, en windows no veo la necesidad, a menos de que sea una impresora que emita tickets y si esta conectada al puerto paralelo con la función SYS(13) devuelve "OFFLINE" solo si no tiene papel, no conozco otra manera de verificar el estado ON/OFF de la impresora.
Gracias por tu ayuda, ya resolví el problema con otro código, manipulando directamente el puerto paralelo de la impresora y obteniendo el valor binario de la impresora offline.
De antemano, gracias

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas