views:

264

answers:

1

I've recently become interested in writing some system services for OS X but since I have no application to advertise the services under I must resort to writing standalone system services. Apple's documentation on System Services is spartan as it is, but its documentation on standalone services is non-existant.

What I have thus far is an Xcode project built from the bundle package, with the two sources HashifyService.h and HashifyService.m. Here is the test code I have:

- (void) doServiceWork:(NSPasteboard *)pboard
   userData:(NSString *)userData
     error:(NSString **)error {
  NSLog(@"Actually in the service now");
  NSString *pboardString;
  NSArray *types;

  NSLog(@"do test magic service! (pboard: %@, types: %@)", pboard, [pboard types]);


  NSString* outputString = @"It Worked";
  types = [NSArray arrayWithObject:NSStringPboardType];
  [pboard declareTypes:types owner:nil];
  [pboard setString:outputString forType:NSStringPboardType];
  [outputString release];
  return;
}

and this is the NSServices entry in my Info.plist:

<dict>
<key>NSMenuItem</key>
<dict>
 <key>Menu item title</key>
 <string>HashifyTest</string>
</dict>
<key>NSMessage</key>
<string>doServiceWork</string>
<key>NSPortName</key>
<string>HashifyService</string>
<key>NSReturnTypes</key>
<array>
 <string>NSStringPboardType</string>
</array>
<key>NSSendTypes</key>
<array>
 <string>NSStringPboardType</string>
</array>
</dict>

I then build the service bundle and place it in ~/Library/Services/ where it is appropriately detected and I am given the option to use the service. Upon activating the service, however, an error occurs and is logged to Console:

..../Hashify.service/Contents/MacOS/Hashify: cannot execute binary file

What am I doing wrong?

+5  A: 

You need a main() function. That should register the service using NSRegisterServicesProvider() and enter the run loop. That is in the documentation.

Graham Lee