Remote and shared lock management (DDE with TCP/IP
way).
When ScriptEZ.API based script file is running,
an identification area is appended
to the system menu of the console windows
as following:
'//////////////////////////////////////////////////////////////////////////////
' Author: SY
' Demo
ScriptEZ.API based application which uses facilities from RAD API:
' . Dynamic Data Exchange (DDE) usage
' . Thread Pool usage
' . Echo() method usage which
displays always messages into a console window
' instead of WScript.Echo() with 2 behaviours for cscript.exe
or wscript.exe
' . ScriptEZ.API Remoting Control Interface usage by
NPTelnet.exe program
' (Connect to
ScriptEZ.API process with <processid (PID)> as connection name)
'
' Purpose:
Using DDE protocol to ask 10 times per second for lock/unlock onto
' random numbers between 1224 and 1234 via DDE Server (aka
Rldrmon.exe)
' which is connected to COM/DCOM App (aka RLoader.exe) onto a
local or
' remote PC, otherwise Rldrmon attempts to a ServerDoc app
with TCP/IP
'//////////////////////////////////////////////////////////////////////////////
const SCRIPTEZ_API = "ScriptEZ.API" '
Component name
Dim Hostname
Dim WshShell
Dim ScriptEZ
Dim StartTime
Dim onExit
Dim hDde
Dim hThreadPool
Dim locked
Dim failed
' start the script
'////////////////
On Error Resume Next
Main()
' Main Subroutine
'////////////////
Sub
locked = 0
failed = 0
onExit = 0
StartTime = Now()
Set WshShell = WScript.CreateObject("WScript.Shell")
' instantiate component object with callback interface
Set ScriptEZ = WScript.CreateObject(SCRIPTEZ_API,"ScriptEZ_")
ScriptEZ.SetCPUCoreAffinity
"0" ' CORE1 if multi-core CPU
' Register App for receiving AppEvent(s) with
onAppEvent(EventID)
ScriptEZ.AppRegister
Dim hStringTable
hStringTable
= ScriptEZ.MallocStringTable(2)
r = ScriptEZ.AddStringTableItem(hStringTable,"localhost")
r = ScriptEZ.AddStringTableItem(hStringTable,"127.0.0.1")
Hostname = ScriptEZ.InputComboBox(0,"Select
or enter a host on which Remote Loader app is running: ",hStringTable)
ScriptEZ.FreeStringTable
hStringTable
if
Len(Hostname) <= 0 Then
ScriptEZ.AppUnregister
Set ScriptEZ = Nothing
Exit Sub
End If
' case 1 : init conversation with DDE server - connecting to
a RLoader app (COM/DCOM way)
hDde =
ScriptEZ.StartConnectionToDDEServer("dde_remotelock@"+Hostname,"lock@"+Hostname)
' retry to start DDE server (rldrmon.exe) connecting to a
ServerDoc instance, if failed
If hDde <= 0 Then
' case 2:
connecting to a ServerDoc app (tcp/ip way)
WshShell.Run "rldrmon.exe
/autoconnect:"+Hostname+":8088",6
' case 2b: connecting to a ServerDoc for Mobile app (tcp/ip
way)
'WshShell.Run
"rldrmon.exe /autoconnect_mobile:"+Hostname+":8088",6
Do Until ScriptEZ.FindWindow("ATL:00424730","Remote
Loader Monitor ["+Hostname+":8088]") > 0
WScript.Sleep 2000
ScriptEZ.clearConsole
ScriptEZ.Echo "...Wait
till Remote Loader Monitor ["+Hostname+":8088] is up
!"
WScript.Sleep 4000 ' to
let DDE subsystem to initialize
' init conversation with DDE server
hDde =
ScriptEZ.StartConnectionToDDEServer("dde_remotelock@"+Hostname,"lock@"+Hostname)
End If
If hDde <= 0 Then
ScriptEZ.AppUnregister
Set ScriptEZ = Nothing
Set WshShell = Nothing
Exit Sub
End If
' Hide console window if 0
ScriptEZ.ShowConsoleWindow 1
' creating a pool with 1 thread to request lock/unlock
hThreadPool
= ScriptEZ.CreateTaskQueueObject(1)
r = ScriptEZ.AddTask(
hThreadPool, hDde )
' block until AppEventID = 3 is received
Do Until onExit = 3
WScript.Sleep 200
ScriptEZ.AppUnregister
If hDde > 0 Then
ScriptEZ.ReleaseConnectionFromDDEServer hDde
Set ScriptEZ = Nothing
Set WshShell = Nothing
End Sub
' Callbacks for
App Events notification and fetching help text
'/////////////////////////////////////////////////////////////
Sub ScriptEZ_onAppEvent(EventID)
If EventID = 3 Then onExit =
EventID
End Sub
Function ScriptEZ_AppEventHelp()
ScriptEZ_AppEventHelp = CStr("AppEventID = 3 to exit")
End Function
' Callback for thread pool
object (TaskQueueObject)
'//////////////////////////////////////////////////
Function ScriptEZ_onRun(
localStorage )
Dim isLocked
WScript.Sleep 100 '
repeat this task 10 times per second
If hDde > 0 Then
' initialise random number
Randomize
' random numbers between 1224 and 1234
random
= Int( (1234-1224+1) * Rnd + 1224.0)
isLocked
=
ScriptEZ.ExecuteCommandOfDDEServer(hDde,"lockon["+CStr(random)+"]")
If isLocked > 0 Then
locked
= locked + 1
isLocked
=
ScriptEZ.ExecuteCommandOfDDEServer(hDde,"lockoff["+CStr(random)+"]")
Else
failed
= failed + 1
End If
End If
ScriptEZ.SetConsoleTitle CStr(StartTime) + " - Lock Stats: locked(" +
CStr(locked) + "), failed(" + CStr(failed) + ")"
ScriptEZ.ClearConsole
ScriptEZ.Echo vbLF + _
"Lock server: " + Hostname + vbLF + _
"Locked ....: " + CStr(Fix((locked/(locked+failed))*100))
+"%" + vbLF + _
"Failed ....: " + CStr(Fix((failed/(locked+failed))*100))
+"%"
If onExit = 3 Then
ScriptEZ_onRun = CLng(0) ' stop this task
Else
ScriptEZ_onRun = CLng(1) ' run again this task
End If
End Function