Hola Escafandra...
Con respecto a este post : http://delphiaccess....google_vignette
Tu escribiste una funcion muy interesante para saber el status de la impresora, probe tu funcion usando el Delphi Tokyo 10.2 en Windows 10 y la funcion siempre me devuelve falso.
Por que sera que no funciona???
Me gustaria que por favor la revisaras nuevamente ya que el post se publico hace unos años. Es una funcion muy util!!!
Gracias por tu ayuda y atencion...
Buenas tardes, saludos desde San Jose, de Costa Rica.
Este hilo es un poco antiguo; pero contiente lo que Yo necesito, les resumo
Tengo una aplicación en delphi 2007 que controla la impresión de las ordenes de poduccion de la empresa, todas la impresoras son en red y tienen definido un IP especifico, Yo tengo una rutina que detecta si la IP esta activa, si esta activa envio la impresión sino me espero hasta que este activa, esta rutina funciona muy bien en windows server 2003; pero necesito migrar a windows 10 y algo sucede pero no me funciona este apagada o encendida, siempre me envia el status de que la IP esta inactiva.
Buscando otras alternativas esta rutina tiene lo que Yo necesito, enviar el nombre de la impresora y me responda si esta activa asi de simple; PERO me sucede lo mismo...
ejecuto un trace de la rutinaSerá que hay que cambiar algún parametro para que funcione en windows 10?
Result:= false;
if OpenPrinter(PCHAR(NamePrinter), hPrinter, 0) then (ejecuta bien esta linea)
if GetPrinter(hPrinter, 6, PBYTE(@dwStatus), sizeof(DWORD), @Needed) then (al tratar de ejecutar esta, como que no se cumple la condicion y se va al end, entonces siempre es falso)
Result:= not boolean(dwStatus);
end;
Agradecería much si me puediesen orientar, nuevamente muy agradecido por su ayuda.
Tras una petición privada he revisado este hilo y he visto que ya se había presentado la misma cuestión en Win10.
Parece que el buffer que requiere la API GetPrinter en Win10 es de mayor tamaño del definido por la estructura que se ha de utilizar. M$ utiliza muy a menudo una forma de conocer el tamaño del buffer necesario que utiliza en esta API y es así como vamos a conocer el tamaño de buffer que necesita Win10. La función la podemos escribir de esta forma
function IsPrinterAvailable(PrinterName: String): boolean; var dwStatus: PDWORD; Needed: DWORD; hPrinter: THANDLE; begin Result:= false; if OpenPrinter(PCHAR(PrinterName), hPrinter, 0) then begin GetPrinter(hPrinter, 6, nil, 0, @Needed); // Preguntamos por el tamaño de buffer necesario GetMem(dwStatus, Needed); // Reservamos memoria if GetPrinter(hPrinter, 6, dwStatus, Needed, @Needed) then Result:= dwStatus^ <> PRINTER_STATUS_NOT_AVAILABLE; FreeMem(dwStatus); // Liberamos el buffer end; end;
Saludos.