AppleScript和崩溃

问题描述:

我想从我的C++应用程序执行一个苹果脚本,但我仍然没有成功使它稳定。 我的第一种方法是用碳API:AppleScript和崩溃

  1. ::OSACompileExecute(Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID); 我在哪里创建的组件每一个脚本执行,并在同一范围内将其释放。但我坚持这个问题:有时它试图释放组件时崩溃。所以似乎在脚本引擎中出现了一些问题,并以某种方式破坏了组件。
  2. ::OSACompileExecute(m_Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID);m_Component是在构造函数创建和应用程序执行期间所居住的ComponentInstance:所以我切换到另一种,但类似的方法我没有找到任何soultions。因此,在发布Component时发生的崩溃消失了,因为在应用程序运行时没有释放步骤。但是还有一个问题:当用户尝试注销时,弹出窗口显示“MyApp阻止注销”(类似这样),MyApp关闭。所以当我关闭这个弹出窗口时,我可以注销。所以看起来组件释放的问题做了一些事情,告诉系统它不能关闭。我没有在这里找到任何解决办法,所以我决定Sitch为到3的方法:
  3. 可可 - NSAppleScript 解决方案是非常简单的小:

    QString ExecuteAppleScript(const QString& strScriptText) 
    { 
    QString strResult; 
    
    NSAutoreleasePool* Pool = [[NSAutoreleasePool alloc] init]; 
    NSString* ScriptText = [[NSString alloc] initWithBytes:strScriptText.toUtf8().data() length:strScriptText.size() 
        encoding:NSUTF8StringEncoding]; 
    NSAppleScript* Script = [[NSAppleScript alloc] initWithSource:ScriptText]; 
    if (Script) 
    { 
        NSDictionary* ErrorInfo = nil; 
        NSAppleEventDescriptor* Result = [Script executeAndReturnError:&ErrorInfo]; 
        if (Result) 
        { 
         strResult = QString::fromUtf8([[Result stringValue] UTF8String]); 
        } 
        else if (ErrorInfo) 
        { 
         QString strErrorInfo = QString::fromUtf8([[ErrorInfo description] UTF8String]); 
        } 
    } 
    [ScriptText release]; 
    [Pool release]; 
    
    return strResult; 
    

    }

有在这里有一些Qt类,但它们不相关。所以,它的工作原理,但它与NSAppleScript胆量,日志的一个内部不同的地方崩溃了:

Thread 5 Crashed: 
0 com.apple.applescript   0x000000010ff0a4c9 ASCoerceToDesc(unsigned int, unsigned int, int, AEDesc*) + 84 
1 ...ple.CoreServices.CarbonCore 0x00007fff86545e48 CallComponentFunction + 28 
2 com.apple.applescript   0x000000010ff05cb1 AppleScriptComponent + 1728 
3 com.apple.applescript   0x000000010ff1ebd0 AGenericCall::Delegate(ComponentInstanceRecord*) + 46 
4 com.apple.applescript   0x000000010ff1e524 AGenericManager::HandleOSACall(ComponentParameters*) + 54 
5 com.apple.applescript   0x000000010ff1e4b4 GenericComponent + 219 
6 com.apple.openscripting   0x00007fff8716ae34 OSACoerceToDesc + 65 
7 com.apple.Foundation   0x00007fff87c61a83 -[NSAppleScript(NSPrivate) _executeWithMode:andReturnError:] + 170 

所以现在我不知道我能做到克服这些AppleScript的崩溃还有什么...

附加信息:

  1. AppleScript经常执行,每秒至少执行1个脚本。
  2. Script是(只是把它从C++代码):

    做shell脚本\ “名为ioreg -c IOHIDSystem” “| perl的-ane“如果(/空闲/){$闲置=(弹出@ F)/ 1000000000; print $ idle,\\“\\”; last}'\“

  3. AppleScipt不是从主线程执行的。我听说10.6.6之前的MacOS X版本上NSAppleScript出现问题,但是我在10.6.7上测试了它。无论如何,1和2方法不应该受到线程的困扰。
  4. 崩溃是随机的。所以它可以全天工作,也可以在开始后立即开始工作。

任何人都可以帮助我吗? 提前谢谢!

你提到你正在从不同的线程运行NSApplescript。如果您对NSApplescript文档中看看,右顶部,它说的:

Important: You should access NSAppleScript only from the main thread. 

因此,只要知道它不是线程安全,这或许对你的问题的原因。

编辑:我在代码中看到其他一些问题。首先,你不释放你使用alloc/init创建的“脚本”。接下来,这是主要问题......您的“ErrorInfo”是一个包含键/值对的字典。你没有使用键来获取值,这就是你的崩溃发生的地方。它无法返回字典的“描述”。下面是我用来创建该错误字典的NSString的示例代码,所以请执行此类操作。

NSString* errorInfo = [NSString stringWithFormat:@"Error:%@ %@", [errorDict valueForKey:@"NSAppleScriptErrorNumber"], [errorDict valueForKey:@"NSAppleScriptErrorMessage"]]; 

最后,你是否使用了像“performSelectorOnMainThread”这样的方法来确保它在主线程上运行?

+0

嗯,我已经看到了一些10.6.6更改日志,其中有一条声明表示NSAppleScript变得线程安全。另一方面官方文件反过来说。我会尝试在主线程 – ixSci 2011-05-28 07:06:56

+0

@ regulus6633内使用它,但它没有帮助。我将NSAppleScript执行转移到主线程中,并且崩溃了 – ixSci 2011-05-30 06:15:23

+0

我在上面的代码中添加了一个编辑部分,这应该有所帮助。 – regulus6633 2011-05-30 16:49:04