FROM : jonathan@mugginsoft.com
DATE : Sat Jan 05 01:02:44 2008
Great reply. Googling for AEMApplication shows that you have more or
less answered my question on the list before.
Apologies that I didn't find it.
Many thanks
Jonathan
> FROM : has
> DATE : Fri Jan 04 23:46:36 2008
>
> <email_removed> wrote:
>
> > I am trying to call as wide as possible a variety of AppleScripts
> > from cocoa using NSAppleScript and am having trouble
> > finding a way of calling a script with a parameterised run handler.
> > [...]
>
>
> > Calling the run handler explicitly by name with NSAppleScript -
> > executeAppleEvent results in:
> >
> > Error -1708 occured the run(Hello) call: (null)
>
>
> 'run' is an AppleScript-defined keyword, not a user-defined
> identifier, so make sure you're using the appropriate AE codes
> ('aevt'/'oapp' in this case). Example:
>
> #import "Appscript/Appscript.h"
>
>
> int main (int argc, const char * argv[]) {
> NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
>
> // Create AEMApplication object for building AEMEvents
> AEMApplication *app = [[AEMApplication alloc] init];
>
> // Create AEMCodecs object for unpacking script results
> AEMCodecs *codecs = [[AEMCodecs alloc] init];
>
> // Build parameter list for script
> NSArray *params = [NSArray arrayWithObjects:@"Hello ", @"World!",
> nil];
>
> // Create 'aevtoapp' (AppleScript subroutine) AEMEvent
> AEMEvent *evt = [app eventWithEventClass:kCoreEventClass
> eventID:kAEOpenApplication];
>
> // Add parameter list to AEMEvent
> [evt setParameter:params forKeyword:keyDirectObject];
>
> // Compile (or load) the AppleScript
> NSAppleScript *scpt = [[NSAppleScript alloc] initWithSource:
> @"on run {arg1, arg2}\n"
> @" return arg1 & arg2\n"
> @"end run"];
>
> // Get an NSAppleEventDescriptor from AEMEvent
> NSAppleEventDescriptor *evtDesc = [evt appleEventDescriptor];
>
> // Send event to AppleScript
> NSDictionary *error;
> NSAppleEventDescriptor *resDesc = [scpt executeAppleEvent:evtDesc
> error:&error];
>
> // Unpack script result
> id res = [codecs unpack:resDesc];
> NSLog(@"Result = %@", res); // "Result = Hello World!"
>
> [scpt release];
> [codecs release];
> [app release];
> [pool release];
> return 0;
> }
>
>
> Notes:
> - An aevt/oapp event will work even for scripts that don't have
> explicit run handlers.
>
> - While you must pass all parameters expected by the script, any
> excess parameters are simply ignored. That means you can always pass
> parameters, and if the script doesn't need them it can simply ignore
> them.
>
> has
> --
> http://appscript.sourceforge.net
> http://rb-appscript.rubyforge.org
DATE : Sat Jan 05 01:02:44 2008
Great reply. Googling for AEMApplication shows that you have more or
less answered my question on the list before.
Apologies that I didn't find it.
Many thanks
Jonathan
> FROM : has
> DATE : Fri Jan 04 23:46:36 2008
>
> <email_removed> wrote:
>
> > I am trying to call as wide as possible a variety of AppleScripts
> > from cocoa using NSAppleScript and am having trouble
> > finding a way of calling a script with a parameterised run handler.
> > [...]
>
>
> > Calling the run handler explicitly by name with NSAppleScript -
> > executeAppleEvent results in:
> >
> > Error -1708 occured the run(Hello) call: (null)
>
>
> 'run' is an AppleScript-defined keyword, not a user-defined
> identifier, so make sure you're using the appropriate AE codes
> ('aevt'/'oapp' in this case). Example:
>
> #import "Appscript/Appscript.h"
>
>
> int main (int argc, const char * argv[]) {
> NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
>
> // Create AEMApplication object for building AEMEvents
> AEMApplication *app = [[AEMApplication alloc] init];
>
> // Create AEMCodecs object for unpacking script results
> AEMCodecs *codecs = [[AEMCodecs alloc] init];
>
> // Build parameter list for script
> NSArray *params = [NSArray arrayWithObjects:@"Hello ", @"World!",
> nil];
>
> // Create 'aevtoapp' (AppleScript subroutine) AEMEvent
> AEMEvent *evt = [app eventWithEventClass:kCoreEventClass
> eventID:kAEOpenApplication];
>
> // Add parameter list to AEMEvent
> [evt setParameter:params forKeyword:keyDirectObject];
>
> // Compile (or load) the AppleScript
> NSAppleScript *scpt = [[NSAppleScript alloc] initWithSource:
> @"on run {arg1, arg2}\n"
> @" return arg1 & arg2\n"
> @"end run"];
>
> // Get an NSAppleEventDescriptor from AEMEvent
> NSAppleEventDescriptor *evtDesc = [evt appleEventDescriptor];
>
> // Send event to AppleScript
> NSDictionary *error;
> NSAppleEventDescriptor *resDesc = [scpt executeAppleEvent:evtDesc
> error:&error];
>
> // Unpack script result
> id res = [codecs unpack:resDesc];
> NSLog(@"Result = %@", res); // "Result = Hello World!"
>
> [scpt release];
> [codecs release];
> [app release];
> [pool release];
> return 0;
> }
>
>
> Notes:
> - An aevt/oapp event will work even for scripts that don't have
> explicit run handlers.
>
> - While you must pass all parameters expected by the script, any
> excess parameters are simply ignored. That means you can always pass
> parameters, and if the script doesn't need them it can simply ignore
> them.
>
> has
> --
> http://appscript.sourceforge.net
> http://rb-appscript.rubyforge.org
| Related mails | Author | Date |
|---|---|---|
| jonathan@mugginsof… | Jan 4, 21:56 | |
| has | Jan 4, 23:46 | |
| jonathan@mugginsof… | Jan 5, 01:02 |






Cocoa mail archive

