2011-11-25 3 views
1

Я установил обработчик событий для Apple, URL, в мое приложение:AEInstallEventHandler обработчик не вызывается при запуске

OSStatus e = AEInstallEventHandler(kInternetEventClass, 
          kAEGetURL, 
          NewAEEventHandlerUPP(AppleEventProc), 
          (SRefCon)this, 
          false); 

И это работает, если мое приложение работает. Однако, если мое приложение не запущено, щелчок по URL-адресу в браузере запускает приложение, но Apple Event не получено на моем обработчике. Мой вызов AEInstallEventHandler во время фазы запуска моего приложения, прежде чем он достигнет цикла сообщений. Это не первое, что я делаю, но не слишком далеко от него. (Очевидно, что я правильно настроил plist, так как я получаю события во время работы)

Любые идеи о том, как это сделать?

Интересно, когда Chrome начинает обрабатывать URL-адрес mailto, он передает «-psn_0_5100765» в командной строке. Что для меня ничего не значит, кто-нибудь знает, что он пытается мне сказать?

Примечание. Я настроил отладку Apple Event и снова запустил ее. Я определенно получаю сообщение GURL при запуске, после того как я установил обработчик обратного вызова. Однако я все еще не могу понять, почему мой callback не вызывается с этим событием.

+0

Вы пишете новое приложение Carbon? Зачем??!? В любом случае ... есть ли способ, которым вы можете поместить свой AEInstallEventHandler в функции, вызываемые при запуске приложения? (идея заключается в том, что обработчик находится на месте до того, как события Carbon будут обработаны, и Apple Event будет удалено без обработчика) –

+0

Обработчик установлен во время создания моего первого объекта и определенно до цикла сообщения. Я работаю над существующим приложением, которое у меня нет времени на порт в какао. – fret

+0

'-psn_0_5100765' выглядит как' ProcessSerialNumber', который является более старым (до Углеродной эры) Mac-эквивалентом идентификатора процесса (с оговорками.) Я подозреваю, что '0' является высоким' long' PSN, 5100765' - низкий 'long'. Вероятно, это PSN на вкладке Chrome. –

ответ

0

Так у меня есть некоторый код, используя ReceiveNextEvent:

while 
    (
     ReceiveNextEvent 
     (
      0, 
      NULL, 
      0.001, // kEventDurationForever, 
      kEventRemoveFromQueue, 
      &theEvent 
     ) 
     == 
     noErr 
    ) 
    { 
     SendEventToEventTarget(theEvent, theTarget); 
     ReleaseEvent(theEvent); 
    } 

Это называется несколько раз при запуске приложения. Случается, что обработка этих событий не учитывает необходимость вызова AEProcessEvent для событий kEventAppleEvent. Это делается автоматически внутри RunApplicationEventLoop, но вы должны сделать это вручную, если используете цикл ReceiveNextEvent. Поэтому я добавил это в свой цикл следующим образом:

while 
    (
     ReceiveNextEvent 
     (
      0, 
      NULL, 
      0.001, // kEventDurationForever, 
      kEventRemoveFromQueue, 
      &theEvent 
     ) 
     == 
     noErr 
    ) 
    { 
     if (GetEventKind(theEvent) == kEventAppleEvent) 
      AEProcessEvent(theEvent); 

     SendEventToEventTarget(theEvent, theTarget); 
     ReleaseEvent(theEvent); 
    } 

И теперь он работает при запуске И во время работы.

Uli Kusterer был ответственным за указание меня в правильном направлении. Огромное спасибо ему.

Смежные вопросы