A continuación encontrarás traducido al castellano el artículo escrito por Wayne Golding y publicado originalmente en el Blog oficial de Xojo.
En ocasiones querrás utilizar los recursos disponibles en el ordenador del usuario desde tu aplicación web; por ejemplo cuando quieres imprimir un recibo de venta para un sitio de punto de venta. En este artículo ampliaremos lo que nos mostró William Yu en su artículo de 2016 sobre como crear esquemas de URIs personalizados para Windows. Nuevamente, utilizaré como ejemplo una aplicación en la que se muestra una alerta simple, añadiendo un guión de Inno Setup para instalar la app cliente, y también mostraré cómo invocar dicha app desde nuestra aplicación web.
En primer lugar crearemos una aplicación de escritorio sin interfaz de usuario. Para este caso utilizaremos una app de consola en la que se muestra un cuadro de comando.
Crea un nuevo proyecto de escritorio en el IDE de Xojo y borra Window1 y MainMenuBar. Luego, añade el evento Opening a la aplicación e introduce el siguiente código:
Self.AllowAutoQuit = True
Esto permitirá que la app finalice cuando termine su tarea.
Añade el evento DocumentOpened al objeto App, e introduce este código:
If item _ ' Usamos la propiedad NativePath
.NativePath _ ' correspondiente al item
.NthField(":", 1) <> "AlertDemo" Then ' Compare the value left of the ":"
Return ' Si no es válido, volvemos (salimos de la app)
End If
Var alert As String ' Define la variable
alert = item _ ' Utilizando la propiedad NativePath
.NativePath _ ' del item
.NthField(":", 2) ' Extrae los contenidos a la derecha de ":"
alert = DecodeURLComponent(alert) ' Convierte el contenido a texto plano
MessageBox(alert) ' Muestra la alerta
' La aplicación saldrá ahora
Para probar la app, selecciona Shared en Build Settings.
E introduce un valor en el campo Command Line Arguments:
Al ejecutar la app en modo de depuración mostrará lo siguiente:
Compila ahora el proyecto y crea un instalador utilizando Inno Setup.
[Setup]
AppId={{B4D9ABDA-9F58-4FE0-A5F3-3E39C28EAB59}
AppName=Alert Demo
AppVersion=1.0
DefaultDirName={commonpf64}\Axis Direct Ltd\Alert Demo
DefaultGroupName=Axis Direct
OutputDir=C:\Xojo Projects\Alert Demo\Installer
OutputBaseFilename=AlertDemoInstaller
Compression=lzma
SolidCompression=yes
ChangesEnvironment=yes
[Languages]
Name: "english"; MessagesFile: "compiler:Default.isl"
[Tasks]
[Dirs]
Name: "{app}\Alert Demo Libs"
[Files]
Source: "C:\Xojo Projects\Alert Demo\Project\Builds - Alert
Demo\Windows 64 bit\Alert Demo*"; DestDir: "{app}"; Flags:
ignoreversion
Source: "C:\Xojo Projects\Alert Demo\Project\Builds - Alert
Demo\Windows 64 bit\Alert Demo\Alert Demo Libs*"; DestDir:
"{app}\Alert Demo Libs"; Flags: ignoreversion
[Icons]
[Run]
[Registry]
Root: HKCR; Subkey: "AlertDemo"; Flags: uninsdeletekey
Root: HKCR; Subkey: "AlertDemo"; ValueType: "String";
ValueData: "URL:AlertDemo Protocol"; Flags: uninsdeletekey
Root: HKCR; Subkey: "AlertDemo"; ValueName: "URL Protocol";
ValueType: "String"; ValueData: ""; Flags: uninsdeletekey
Root: HKCR; Subkey: "AlertDemo\shell"; Flags: uninsdeletekey
Root: HKCR; Subkey: "AlertDemo\shell\open"; Flags:
uninsdeletekey
Root: HKCR; Subkey: "AlertDemo\shell\open\command"; Flags:
uninsdeletekey
Root: HKCR; Subkey: "AlertDemo\shell\open\command";
ValueType: String; ValueData: "{app}\Alert Demo.exe %1";
Flags: uninsdeletekey
La sección registry crea las entradas en el registro de Windows tal y como se indica en el artículo de William.
Ahora que la aplicación está instalada nos encargaremos de la aplicación Web. Para simplificar las cosas durante nuestras pruebas, simplemente añadiré un Button (Botón) a WebPage con el siguiente código en su evento Pressed:
Var s As String = "Hello World"
Var Alert As String
Alert = EncodeURLComponent(s) ' Nos aseguramos de que la cadena sea segura para el URL
GoToURL("AlertDemo:" + Alert, True) ' Ejecuta la app en una nueva pestaña del navegador
¡Y eso es todo!
Para imprimir el recibo, pasaré un identificador único correspondiente a la transacción utilizando para ello este método y, luego, acceder a los datos usando URLConnection y HandleURL.