slewis@altair.aero.org (08/22/90)
I am trying to determine whether an application is running under THINK C
and later launch it if it is running. The Code ApplicationIsRunning below runs the
first time and gives illegal instruction on the on the GetItem call the second
time I call it. The Handle AppleMenu is not altered between
calls. I don't understand the problem.
Also is the code for ActivateApplication proper? If the Activation is in WaitNextEvent
with the wake up interval 0 will it wake up? If the target uses the same routine to
return control will my program continue from where it left off???
MenuHandle AppleMenu;
... /* Initialization */
AppleMenu = NewMenu(1,(StringPtr)"\P\024"); /* file menu */
AppendMenu(AppleMenu,(StringPtr)"\pAbout ...");
AddResMenu(AppleMenu, (ResType) 'DRVR');
InsertMenu(AppleMenu,0); /* Add as last menu */
....
boolean CaseLessCompare(register char *s1,register char *s2,register int i)
{
while(i--) if(*(s1++) != *(s2++)) return(false);
return(true);
}
/*
Test to see if an application is running
*/
boolean ApplicationIsRunning(char *ApplicationName)
{
int i,NItems;
int NameLength;
StringPtr ItemName;
NItems = CountMItems(AppleMenu);
NameLength = strlen(ApplicationName);
for(i = 1; i <= NItems; i++) {
GetItem(AppleMenu,(short)i,ItemName);
if(CaseLessCompare((char *)&ItemName[1],ApplicationName,NameLength))
return(true);
}
return(false); /* Not Running */
}
/*
Activate Application - it better send you back
*/
void ActivateApplication(char *ApplicationName)
{
int i,NItems;
int NameLength;
char *ItemName;
char *AccessaryName = NULL; /* will be real name if running */
GrafPtr savePort;
/* Is the Application running - if so get its real name */
NItems = CountMItems(AppleMenu);
NameLength = strlen(ApplicationName);
for(i = 1; i <= NItems; i++) {
GetItem(AppleMenu,(short)i,(StringPtr)ItemName);
if(CaseLessCompare(&ItemName[1],ApplicationName,NameLength)) {
AccessaryName = ItemName;
}
}
if(!AccessaryName) error_exit("Target Application Not Running"); /* Not Running */
GetPort(&savePort);
OpenDeskAcc((StringPtr)AccessaryName);
SetPort(savePort);
}