No imprime a puerto de Red en Windows 10

Tras una actualización de Windows 10, sin razón aparente dejó de funcionar la impresión de archivos de bajo nivel mediante un puerto de red. Te cuento:

En tiempos pasados, imprimir a un puerto serial o paralelo era sumamento sencillo. Abrias el puerto como si fuese un archivo y le escribías texto y salía en la impresora. A esto se le llama impresión de archivos de bajo nivel. Luego llegó USB y la cosa cambió…

Las impresoras USB no permiten escribir texto directamente sobre su puerto, por lo que los ingeniosos (no ingenieros), descubrieron que si compartían la impresora, sí se podía. Así que bendita solución.

Luego llegó Windows Vista e incluyó grupo hogar y ya se empezó a complicar la situación. Ahora no se podía simplemente escribir directamente sobre un puerto de red directemente sobre el, sin formar parte del mismo grupo de trabajo.

Luego llegó Windows 7. Ahora se llama grupo Hogar pero funciona igual. Luego en Windows 8 y 8.1 El grupo Hogar se puede protejer con una contraseña, por lo que ahora  necesitas formar parte de ese grupo ingresando la contraseña.

En Windows 10 sigue igual pero ya es más amigable, pero aún hay ocasiones en las que los permisos de escritura y lectura fallan.

Tras la última actualización de Windows 10, no se puede escribirle directamente a una impresora compartida en otro equipo. Desconozco si hay en algún lugar alguna configuración que permita habilitar esta opción, mientras tanto, aunque formes parte del Grupo Hogar no se puede. he buscado mucho y no he encontrado alguna configuración de ese tipo. Aunque deshabilites el firewall, sigue fallando.

Problema: en VBA esto no funciona (es algo similar para otros lenguajes):

Public Function ImprimirHolaMundo()
    Dim NPuerto as Long
    NPuerto = Freefile
    Open \\PC02\Impresora For Output As #NPuerto
    Print #NPuerto, "Hola Mundo"
    Close #NPuerto
End Function

Solución:

No es nueva ni mucho menos, esto se lleva usando desde hace muchos años. Y solo prongo la solución que a mi me ha funcionado.

Configurar un puerto virtual que haga referencia a esa ruta de la impresora compartida. Lo puedes hacer desde la consola con:

Net use LPT1: \\PC02\Impresora

Si quieres hacerlo persistente, que siga funcionando aunque cierres esa ventana de comandos:

Net use LPT1: \\PC02\Impresora /persistent: yes

Pero si reinicias, hay que volver a hacerlo. Así que puedes crear algún script para que se ejecute cada vez que se reinicie, ya toca echar imaginación.

Y la función inicial ahora funcionará perfetamente de esta manera:

Public Function ImprimirHolaMundo()
    Dim NPuerto as Long 
    NPuerto = Freefile 
    Open LPT1: For Output As #NPuerto
    Print #NPuerto, "Hola Mundo" Close #NPuerto
End Function

En mi caso, me hice una función para registrar y desregistrar este puerto virtual:

Public Function PuertoVirtual_Registrar(sImpresora As String, Optional sPuerto As String = "LPT1") As Boolean
 PuertoVirtual_Eliminar sPuerto
 Dim P As String
 P = "NET USE " & sPuerto & ": " & sImpresora
 R = Shell("cmd.exe /c " & P, vbHide)
 If R = 0 Then
   PuertoVirtual_Registrar = False
 Else
   PuertoVirtual_Registrar = True
 End If
End Function

Public Function PuertoVirtual_Eliminar(Optional sPuerto As String = "LPT1")
 Dim P As String
 P = "NET USE " & sPuerto & ": /DELETE"
 Shell "cmd.exe /c " & P, vbHide
End Function

Entiendo que quizá haya formas mas profesionales de hacerlo. Si tienes alguna sugerencia, por favor escríbeme en los comentarios.

Una solución de un ingenioso que no es ingeniero 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *