-
Notifications
You must be signed in to change notification settings - Fork 6
Home
Scriptom is an optional Groovy module originally developed by Guillaume Laforge. It combines the elegant "syntactical sugar" of Groovy with the power of the Jacob library (Java COM Bridge). Scriptom lets you use ActiveX or COM Windows components from Groovy. The result is something that looks eerily similar to VBScript - only groovier.
You can use Scriptom to automate Word or Excel documents, control Internet Explorer, make your PC talk using the Microsoft Speech API, monitor processes with WMI (Windows Management Instrumentation), or browse the Windows Registry using WShell - and much more. Scriptom also provides an easy way to talk to custom VB6 or Microsoft.NET libraries.
Of course, Scriptom can be used only on Microsoft Windows.
Scriptom is included as an option in the Windows Installer, and Scriptom can be downloaded from this page (see below). The Scriptom codebase is stable and feature-complete. The Jacob project - Scriptom's foundation - was started in 1999 and is being used in countless production Java applications worldwide. Scriptom is now in wide use as well, and has proven to be stable and mature.
Scriptom gives you all the COM-scripting power of Jacob, only it is a lot easier. See Getting Started with COM for some tips to get you started.
The following are required to run Scriptom:
- Groovy 1.5 or 1.6
- Java 1.5 or later
- Windows and Java for x86 or x64 (AMD64) architectures. Itanium (IA-64) is not supported.
Let's say you want an application that talks. Pure Java implementations aside (this is, after all, a Groovy/COM tutorial), and ignoring the fact that the default voice on pre-Vista machines sounds like Dr. Zoidberg with a sinus infection, you could use the Microsoft Speech API (SAPI) to get the job done.
You start by creating an ActiveXObject with the prog-id for SpVoice. Now you can call any of the methods it supports. By default, SpVoice will block until it is done speaking, but we're also going to have it speak asynchronously and wait until it is done.
If you have scripted COM before, you are probably used to using "magic numbers" throughout your code in place of COM constants. In this code sample, we're using fully-qualified constants instead.
Scriptom includes fully JavaDoc'd constant and interface definitions from a number of commonly used type-libraries, and you can even create your own. The source code for generating COM type library definitions for Groovy is written in Groovy , and it's included in the project. It may not seem like a big deal to replace a couple of numbers, but it will be a lot easier in 10 years to find relevant information on SpeechVoiceSpeakFlags.SVSFlagsAsync than on the number 1 (Google returns a little more than 9 billion hits for the number '1', and about 1,000 for 'SpeechVoiceSpeakFlags.SVSFlagsAsync,' including hits on this paragraph). And besides, the code reads better.
Speaking of interfaces, it turns out that SpVoice supports several. You can test an ActiveXObject to see if it supports a given interface using .supportsInterface, and you can cast an ActiveXObject to a given interface using .toInterface.
This next example displays the COM interfaces that SpVoice supports (within the SAPI library only):
- The Least You Need to Know about COM - how not to crash the JVM or lock your process
- COM Data Types in Scriptom - supported types and conversions in Java, VB6, and VB.NET
- COM Methods and Properties in Scriptom - calling COM methods and properties from Groovy
- Passing Values by Reference (in-out) - how to let methods change the value of passed-in arguments
- COM Events - support for COM events
- All About Arrays - UNDER CONSTRUCTION
- Getting Started with COM - Tips for exploring COM libraries, finding documentation, etc.
- Bridging the Gap Between Java and .NET with Groovy and Scriptom - Implement FIPS 140-1 compliant SHA-1 in Java with Groovy, Scriptom, and Visual Basic.NET.
- Juixe TechKnow - A short Microsoft Outlook example.
- Siebel - Siebel "business component" programming
Here is a simple example that uses the Microsoft ScriptControl to evaluate a JScript expression. This is a very indirect way to add 2 and 2.
There are many, many potential uses for Scriptom - far to many to try to maintain as part of this documentation. So we've included a whole slew of meaty examples in the project archive for you to play with. We'd like to encourage you to go look at those examples, run them, and modify them. And if you come up with an especially interesting example, let us know about it. We may even include it in a future release!
Some additional examples included with Scriptom:
Automated writing to and reading from Excel spreadsheets. Includes COM events example. Navigation in Internet Explorer. Includes COM events example. Gathering information about processes and Windows NT services using WMI. Parsing a *.msg file with Microsoft Outlook. Consuming Visual Basic 6 (VB6) and Visual Basic.NET COM-enabled DLLs.
Scriptom uses late binding. Visual Basic and VBA uses early binding by default, but they also support late binding (with CreateObject). If you are translating working Visual Basic code and if your Scriptom code fails at the point where you've got your call
(or whatever your object is) with an error message
then the chances are the progid "Sage...." that you are using is the wrong one.
So you need to go and look in the registry to find what it might be. One way to do this is with Microsoft's new Powershell cmd utility which you can download from the ms web site. Install this and run the command line
It will produce a ream of different progids which you can sort and search for one that looks a likely candidate. In my case it was SDOEngine.14
Alternatively if you have used the scriptom utility ExtractTlbInfo.groovy to generate name maps for the com object you could read the source code for the (in my case SageDateObject140.java) class and you might find some code and/or comment like this:
Additionally, you can use the Object Browser included with Visual Basic (I recommend the one with VBA) to figure out possible progids and then search the registry. This is a good way to associate interfaces (and their methods) with a particular progid. If there are VBScript or JScript examples available, they will include the correct progids, since these languages are always late-bound.
If all else fails, hit the Groovy mailing lists. There are lots of people out there with COM experience who can point you in the right direction.