gpt4 book ai didi

crash - AppleScript 和崩溃

转载 作者:行者123 更新时间:2023-12-03 16:02:38 26 4
gpt4 key购买 nike

我正在尝试从我的 C++ 应用程序执行一个苹果脚本,但我仍然没有成功使其稳定。
我的第一种方法是使用 Carbon API:

  • ::OSACompileExecute(Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID);我在每个脚本执行时创建组件并在同一范围内发布它。但我坚持这个问题:有时它在尝试释放 Component 时会崩溃。因此,脚本引擎中似乎出现了一些问题,并且它以某种方式损坏了组件。我没有找到任何灵魂,所以我改用另一种但类似的方法:
  • ::OSACompileExecute(m_Component, &ScriptTextDesc, kOSANullScript, kOSAModeNull, &ResultID);在哪里 m_组件 是在 ctor 中创建并在应用程序执行期间存在的 ComponentInstance。因此,由于在应用程序工作时缺少发布步骤,因此发布组件时的崩溃已经消失。但是还有另一个问题:当用户尝试注销时,会显示弹出窗口,上面写着“MyApp 阻止注销”(类似的东西)并且 MyApp 关闭。因此,当我关闭此弹出窗口时,我可以注销。因此,组件发布的问题似乎告诉系统它无法关闭。我在这里没有找到任何解决方案,所以我决定采用第三种方法:
  • cocoa - 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 崩溃......

    附加信息:
  • AppleScript 执行非常频繁,每秒至少 1 个脚本。
  • 脚本是(只是从 C++ 代码中获取):

    执行shell脚本\“ioreg -c IOHIDSystem”
    "| perl -ane 'if (/Idle/) {$idle=(pop @F)/1000000000; 打印 $idle,\\"\\";last}'\"
  • AppleScipt 不是从主线程执行的。我听说 NSAppleScript 在 10.6.6 之前的 MacOS X 版本上存在问题,但我在 10.6.7 上对其进行了测试。无论如何,线程不应该打扰 1 和 2 方法。
  • 崩溃是随机的。所以它可以全天工作,也可以在启动后立即崩溃。

  • 有人可以帮我吗?
    先感谢您!

    最佳答案

    您提到您正在从不同的线程运行 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”之类的方法来确保它在主线程上运行?

    关于crash - AppleScript 和崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6148831/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com