From Pickwiki
Jump to navigationJump to search


The problem: you want a program to run on a windows PC as a result of something that happens on your Windows or Unix-based server. It's usually less of an issue to have a Unix server run something on a Unix client, or Windows server to Windows client - there's plenty of built in ways for that to work. So we'll just consider a Windows PC with a network connection (LAN,WAN or VPN) to a Unix server.

For this to work "something", some program, has to be running on the PC.

0) TerminalEmulators

The most common "something" is a terminal emulator and they pretty much all allow you to send an escape sequence and fire off a program. If you want the program to run in response to something the user did on the server, this is the most straightforward way to do it. Also, if you have a serial connection, this is probably the only option.

  • wIntegrate:
Use the WIN.PCRUN command installed on the server, CALL WIN.PCRUN(COMMAND,ARGS)

To execute a command and return to PICK/BASIC immediately:

PRINT CHAR(27):CHAR(2):"<":command:CHAR(13)

To execute a command and wait for the command to terminate before returning to PICK/BASIC:

PRINT CHAR(27):CHAR(2):">":command:CHAR(13)

See AccuTerm help for details: From the Help Introduction, see AccuTerm Programming. Also see Help on Object Bridge.

More examples are at AccuTermFileTransfer.

  • Powerterm:
  • Netterm:

Start/run the program specified by COMMAND.

CRT CHAR(27):"[]":COMMAND:CHAR(27):"[1*

Send the URL to the client's WWW browser for processing.

CRT CHAR(27):'[]':URL:CHAR(27):'[0*'

Start/run the program specified by COMMAND and wait till it terminates. COMMAND can contain both the program to run and command line arguments.

CRT CHAR(27):"[]":COMMAND:CHAR(27):"[9*"

Start the program associated with the extension contained within FILENAME.

CRT CHAR(27):"[]":FILENAME:CHAR(27):"[12*

1) Doit

Doit is a small utility program that installs a tray applet on the client. The server sends it the path of a file to open.

2) Install rcmd

Either from the windows resource kit, or purchase it from mks. You can then issue an rcmd from the unix side.

3) Install or turn on a telnet server

W2K/XP come with a telnet server, or you can purchase one. Then use to script the login/command process.

4) Install an SSH server

Just like Telnet, only secure!

5a) Write a small server program

Have the program listen on a predefined port. There are obvious security issues here, but with a little handwaving we can move past them :-)

Recent U2 products can create socket connections from basic and connect to the server. Sample code for this is at BasicSocketClient.

Here's a stripped down example of a server in Python:

import SocketServer
import os

class UrlHandler(SocketServer.StreamRequestHandler):
    def handle(self):
        print "opening "+url
        os.system("start "+url)

server=SocketServer.TCPServer( ('', 79), UrlHandler)

On the pc, type "python" to start the server up, then from another machine, "telnet pc-address 79" and then type the url to go to - the client will open up a browser and go to that address.

5b) ...and here's another in VBScript


Option Explicit

' Heavily cribbed from the amazing 4K webserver at:

Dim oSck
On Error Resume Next
Set oSck=WScript.CreateObject("MSWinsock.Winsock","s_")
Select Case Err.Number
    Case 0
    case &H80040112
        echo "No licence found. Install Visual Studio"
    case &H80020009
        echo "ActiveX Winsock not in the registry, check if installed or use regsvr32"
    Case else
        echo "Error " & Err.Number & " - &H" & Hex(Err.Number) & " - " & Err.Description
End Select
On Error Goto 0

echo "Listening on port " & oSck.LocalPort
    ' Sleep for 2 seconds
    WScript.sleep 2000

Sub echo(S)
    WScript.Echo Now & " " & S
End Sub

Sub s_ConnectionRequest(Byval requestID)
    echo oSck.RemoteHostIP & " - Connection request:" & requestID
    oSck.Accept requestID
End Sub

Sub s_Close
    echo "closed - re-listening"
End Sub

Sub s_[[SendComplete]]
End Sub

Sub s_Error(ByVal N, D, ByVal C, ByVal S, ByVal F, ByVal H, Y)
    echo "Error" & N & " - " & D
End Sub

Sub s_DataArrival(Byval b)
    Dim S,sh

    oSck.GetData S
    echo S

    set sh = createobject("")
    on error resume next "cmd /c start " & S
    on error goto 0
End Sub

On the PC, type "cscript urlserver.vbs" to start the server up, then from another machine, "telnet pc-address 79" and then type the url to go to - the client will open up a browser and go to that address.

6) Have a polling program on the client

If the client and the server share access to a directory (via samba or NFS for example), the server can drop a file in the common directory and a program running on the client can watch for new files. When one is found it can read the file and perform some action based on the contents. Here's a VB example:

Private Sub Form_Load()
    txtScheduleNum.Enabled = False
    cboCategory.Enabled = False
    cmdOK.Enabled = False
    cmdPreview.Enabled = False
    Label1.Enabled = False
    Label3.Enabled = False
    ' Start the poll right away
End Sub

Private Sub [[Timer1_Timer]]()
    TxtLog.ForeColor = vbBlack
    LogMsg "Checking c:\batch"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set dir = fso.GetFolder("C:\BATCH")
    For Each file In dir.Files
        If LCase(Right(file.Name, 3)) = "pdf" Then
            Timer1.Enabled = False
            TxtLog.Enabled = False
            fstr = file.Name
            hpsname = Left(fstr, Len(fstr) - 3) & "hps"
            justname = Left(fstr, Len(fstr) - 3)
            LogMsg fstr
            Label1.Enabled = True
            Label3.Enabled = True
            cboCategory.Enabled = True
            cmdOK.Enabled = True
            cmdPreview.Enabled = True
            ' Enable some controls and do something with the file
            Exit For
        End If
End Sub

7) Consider using a solution created specifically to solve the problem

(Ad) The following link goes to the Nebula R&D forum where an offering is discussed and a link is provided to a blog entry for more information. As of the time of this writing the software is fully usable but is not being offered as a product simply for lack of demand. That situation can change with a compelling business case.,51.0.html (/Ad)

A general description of this approach, not specific to the Nebula solution, would be to write a PC program in your favourite language (.Net, Java, Flex for example), that runs on the PC and makes periodic calls to a Pick program using whatever technology makes sense for your Pick variety. In the U2 world, this would be UniObjects, though a web services call that hides the connection details from the client, and be much more likely to work through firewalls, would make more sense.

Note: this is not exactly the problem we are trying to solve on this page. The problem is "how do I run a program on the client side, on demand from a Pick program?" The polling solutions presented suffer from a lag between something happening on the server and a program running on the client.

Running a program on the server from outside

Connectivity to MV is discussed many places in this wiki and any language can be used to execute BASIC business rules and return a result. A unique freeware program called MV Exec uses mv.NET to run any query, any command, any program on a MV server from any PC.

TODO: Expand on this topic with info about D3 compile to executable with G option, UDT, notes about unique jBASE exe/dll design...