起動時にAEInstallEventHandlerハンドラが呼び出されない

私はアプリケーションのURLのApple Event Handlerをインストールしました:

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

それは私のアプリケーションが動作している場合に機能します。しかし、私のアプリケーションが実行されていない場合、ブラウザでURLをクリックするとアプリケーションが起動しますが、Appleのイベントはハンドラで受信されません。 AEInstallEventHandlerへの呼び出しは、アプリケーションの起動フェーズ中に、メッセージループに達する前です。私が最初にやったことではありませんが、それほど離れているわけではありません。 (明らかに、私は実行中にイベントを取得しているので、plistを正しくセットアップしました)

どのようにこの作品を得るための任意のアイデアですか?

面白いことに、Chromeがmailto URLの処理を開始すると、コマンドラインに "-psn_0_5100765"が渡されます。それは私には何も意味しない、誰かが私に言っていることを知っていますか?

注:Apple Eventデバッグをセットアップしてもう一度実行しました。私はコールバックハンドラをインストールした後、確実に起動時にGURLイベントを送信しています。しかし、私はまだコールバックがそのイベントで呼び出されない理由を解決できません。

1
ハンドラは、最初のオブジェクトの作成中に、そしてメッセージループの前に必ずインストールされます。私はココアに移植する時間がないという既存のアプリケーションに取り組んでいます。
追加された 著者 fret,
あなたは新しいCarbonアプリケーションを書いていますか?なぜ??!?とにかく...アプリケーション起動時に呼び出される関数にAEInstallEventHandlerを入れることができる方法はありますか? (Carbonイベントが処理され、Apple Eventがハンドラなしでポップされる前にハンドラが配置されているという考えがあります)
追加された 著者 Michael Dautermann,
-psn_0_5100765 はProcess IDの以前の(Carbon時代以前の)Mac版の( ProcessSerialNumber のように) code>はPSNの上位 long であり、 5100765 は低い long です。おそらく、呼び出し元のChromeタブのPSNです。
追加された 著者 Jonathan Grynspan,
Mozillaソースには存在しますが、Chromiumソースには存在しません。
追加された 著者 Jonathan Grynspan,

1 答え

だから私はReceiveNextEventを使っていくつかのコードを持っている:

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

これはアプリケーションの起動時に何度も呼ばれます。起こっていることは、これらのイベントの処理で、kEventAppleEventイベントのAEProcessEventを呼び出す必要性を考慮していないことです。これは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 was responsible for pointing me in the right direction. So many thanks to him.

0
追加された