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 🙂