AppleEvent:如何调试`eventDidFail`? [英] AppleEvent: how to debug `eventDidFail`?

查看:19
本文介绍了AppleEvent:如何调试`eventDidFail`?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我从控制台中的 SIMBL 收到此错误:

I am getting this error from SIMBL in the console:

05.09.11 17:00:09,165 SIMBL Agent: eventDidFail:'tvea' error:Error Domain=NSOSStatusErrorDomain Code=-1708 "The operation couldn’t be completed. (OSStatus error -1708.)" (the AppleEvent was not handled by any handler ) UserInfo=0x400e485c0 {ErrorNumber=-1708} userInfo:{
    ErrorNumber = "-1708";
}

我正在尝试调试;但由于我还没有真正与 AppleEvent 合作过,我不确定如何解释它.

I am trying to debug this; but as I haven't really worked with AppleEvent that much yet, I'm not really sure how to interpret that.

我认为SIMBL Agent中的相关代码是这样的:

I think the related code in the SIMBL Agent is this:

AEEventID eventID = 'load';

// Find the process to target
pid_t pid = [[appInfo objectForKey:@"NSApplicationProcessIdentifier"] intValue];
SBApplication* app = [SBApplication applicationWithProcessIdentifier:pid];
[app setDelegate:self];
if (!app) {
    SIMBLLogNotice(@"Can't find app with pid %d", pid);
    return;
}

// Force AppleScript to initialize in the app, by getting the dictionary
// When initializing, you need to wait for the event reply, otherwise the
// event might get dropped on the floor. This is only seems to happen in 10.5
// but it shouldn't harm anything.
[app setSendMode:kAEWaitReply | kAENeverInteract | kAEDontRecord];
id initReply = [app sendEvent:kASAppleScriptSuite id:kGetAEUT parameters:0];

// the reply here is of some unknown type - it is not an Objective-C object
// as near as I can tell because trying to print it using "%@" or getting its
// class both cause the application to segfault. The pointer value always seems
// to be 0x10000 which is a bit fishy. It does not seem to be an AEDesc struct
// either.
// since we are waiting for a reply, it seems like this object might need to
// be released - but i don't know what it is or how to release it.
// NSLog(@"initReply: %p '%64.64s'", initReply, (char*)initReply);

// Inject!
[app setSendMode:kAENoReply | kAENeverInteract | kAEDontRecord];
id injectReply = [app sendEvent:'SIMe' id:eventID parameters:0];
if (injectReply != nil) {
    SIMBLLogNotice(@"unexpected injectReply: %@", injectReply);
}

推荐答案

eventDidFail 消息也来自 SIMBL 代理本身.代码如下:

The eventDidFail message also comes from the SIMBL Agent itself. It is this code:

- (void) eventDidFail:(const AppleEvent*)event withError:(NSError*)error
{
    NSDictionary* userInfo = [error userInfo];
    NSNumber* errorNumber = [userInfo objectForKey:@"ErrorNumber"];

    // this error seems more common on Leopard
    if (errorNumber && [errorNumber intValue] == errAEEventNotHandled) {
        SIMBLLogDebug(@"eventDidFail:'%4.4s' error:%@ userInfo:%@", (char*)&(event->descriptorType), error, [error userInfo]);
    }
    else {
        SIMBLLogNotice(@"eventDidFail:'%4.4s' error:%@ userInfo:%@", (char*)&(event->descriptorType), error, [error userInfo]);
    }
}

如果我注释掉这段代码,错误就会消失:

And the error disappears if I comment out this code:

[app setSendMode:kAEWaitReply | kAENeverInteract | kAEDontRecord];
id initReply = [app sendEvent:kASAppleScriptSuite id:kGetAEUT parameters:0];

这篇关于AppleEvent:如何调试`eventDidFail`?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆