2016-04-25 16 views
0

Stellen Sie sich ein Mac OS X.app-Paket vor, das zwei Programme enthält: Eines mit einem Cocoa main(), das NSApplicationMain() zurückgibt, und ein separates Paket mit einer Carbon-Programmdatei mit einem eigenen main().Kann eine Cocoa-App das Main() eines SEPARATE Carbon Bundles im selben App-Paket starten?

Die Cocoa App ist für die Registrierung/Aktivierung. Wir wollen sie nicht in zwei Apps aufteilen. Ich möchte die Ausführung auf dem Carbon main() von INSIDE the Cocoa main() starten. Angenommen, der gesamte Code ist korrekt signiert, sind mehrere Pakete mit "main()" im selben App-Paket erlaubt, und wie startet man ein carbon main() aus dem Cocoa-Code heraus?

+1

Konnte nicht einfach das zweite Bündel mit 'openURL:' o starten r 'launchAppWithBundleIdentifier' oder ähnlich? Warum müssen Sie es von * innerhalb * der App ausführen? – jtbandes

+0

@jtbandes - vertrauen Sie mir, die Details sind lang und beteiligt, aber der Cocoa-Code muss vor dem Carbon-Code laufen. Nur wenn der Cocoa-Code festgelegt hat, was die Carbon App benötigt, kann die Carbon App ordnungsgemäß ausgeführt werden. Der Cocoa-Code muss den Start des Carbon-Codes aufrufen. Wird AppAppWithBundleIdentifier() nicht gestartet? Suchen Sie nach dem App-Paket mit dem Bundle Identifier unter myApp.app/Contents/info.plist? – SMGreenfield

+0

Nun, es klingt wie Ihre Carbon-App ein separates Bundle, so könnte es (sollte?) Eine andere Bundle-ID haben. – jtbandes

Antwort

0

Ich beantworte diese Frage nicht wirklich selbst: der legendäre Eric Schlegel bei Apple DTS einige zusätzliche Überlegungen mitgeteilt, so dass ich bin Entsendung sie hier für andere, die in meinem ungewöhnlichen Spuren folgen wollen kann:

I don’t think this will work in the way that you want it to do. Once the Cocoa app has run its event loop and registered with the window server, that process will be marked as a Cocoa app. You’ll probably run into weird behavior if you then try to run an entirely Carbon event loop and window hierarchy, since everything in the OS will be thinking you’ve got a Cocoa app even though you really are just using Carbon.

In this case, you’re better off just launching your main Carbon app as a separate process.

Having said that, I don’t think there’s actually any particular difficulty in loading your separate Carbon bundle and running it. You’d just use NSBundle or CFBundle to load the bundle by URL, get a function pointer from the bundle for the exported main() function, and call it. Away you go.

JEDOCH - Weder CFBundleGetFunctionPointerForName (myBundle, CFSTR ("_ main")) noch CFBundleGetFunctionPointerForName (myBundle, CFSTR ("main")) arbeiten auf der Carbon-.app Mach-o binär - es gibt diesen Fehler zurück:

Attempt to load executable of a type that cannot be dynamically loaded for CFBundle