2015-08-10 27 views
7

Ich arbeite an einer eigenständigen Daemon-Programmdatei, die ein vorhandenes NPAPI-Plugin eines Drittanbieters auf einem Host-Computer laden muss. Ich möchte die generierten Ansichten vom Plugin in eine Textur/Oberfläche rendern.Problem beim Laden eines NPAPI-Plugins in der Mac-App

Es muss sowohl auf Mac als auch auf Windows funktionieren, aber da ich ein starker Mac-Benutzer bin, entschied ich mich, zuerst die Mac-Version zu bauen. Wir haben nicht den Quellcode für dieses Plugin - es ist etwas, was uns ein externer Anbieter geliefert hat - also ist es eine Blackbox-Implementierung.

Im Internet funktioniert das Plugin sehr ähnlich wie Flash. Sie betten einen Bereich in eine Webseite ein, die mit einem bestimmten MIME-Typ (d. H. Application/flash) verbunden ist und lädt das Plugin, was wiederum das Plugin anweist, eine bestimmte Datei zu laden (denken Sie an SWF) und sie dann zu rendern.

Was ich jetzt tun, ist:

1. Open the library (Bundle) and extract NP_Initialize etc. 
2. Call NP_Initialize -> returns the object with NPP function pointers etc 
3. Call NPP_New (this calls a set of NPP functions) -> ultimately returns NPERR_NO_ERROR. 

Da NPERR_NO_ERROR ist die erwartete Antwort, ich gehe davon aus diese drei Schritte erfolgreich abgeschlossen wurden.

Während NPP_New fordert das Plugin sowohl das Cocoa Event-Modell als auch den Core-Animationsmodus (oder Core-Grafik, wenn ich den Core-Animation-Modus falsch zurückgebe) an.

Dann rufe ich:

4. NPP_SetWindow 
5. Once the window is set, I load an online file with CURL, and call NPP_NewStream/WriteReady/Write and DestroyStream. 

Von dem, was ich in der NPAPI Dokumentation, die NewStream/Writestream/etc Funktionen laden im Grunde eine Datei in den Speicher des Plugins finden konnte, so kann es gemacht werden.

Das Plugin unterstützt sowohl Core Animation als auch Core Graphics in einem Browser und funktioniert in Browsern, die NPAPI-Plugins unterstützen.

Sobald ich alle oben genannten Schritte ausgeführt habe, versuche ich, eine Textur zu rendern, aber im Core Graphics-Modus bekomme ich immer wieder falsche Antworten von NPP_Event-Funktionsaufrufen mit einem CGContextRef. Im Core-Animationsmodus rendere ich die Textur mit renderInContext in eine Bitmap, aber das gesamte Bild bleibt leer/transparent.

Es ist ein langer Schuss, aber hat jemand irgendwelche Ideen?

+1

Gibt es andere Anrufe aus dem Plugin in Ihre „Seite“ zu kommen? Hast du das root NPObject vom Plugin aufgerufen und angefordert?Möglicherweise erwartet Sie etwas, das Sie noch nicht bereitgestellt haben. – taxilian

+0

Wie finde ich heraus, was genau ich dem Plugin zur Verfügung stellen muss? Während NPP_New werden eine Tonne NPN-Funktionen aus dem Plugin (einige Get/SetValue, Invoke, Evaluate) im "fake" Browser aufgerufen. Ich gebe NPObjects basierend auf meiner besten Schätzung zurück, was zurückgegeben werden muss. Nach Versuch und Irrtum (Plugin würde heruntergefahren, wenn die zurückgegebenen Objekte nicht vom richtigen Typ sind), gibt NPP_New schließlich NO_ERR zurück. Ich habe das Root-NPObject nicht vom Plugin aufgerufen (obwohl das Plugin während NPP_New das Root-NPObject vom Browser anfordert). Aber was würde ich mit diesem Objekt machen? – Charles

+0

Ok, ich habe einen Proxy-Plugin-Logger eingerichtet. Wenn das Plugin über Firefox geladen wird, scheint es, dass ein NPN_GetURLNotify-Ereignis empfangen wird, nachdem NPP_New NO_ERR erfolgreich zurückgegeben hat. Meine C++ App empfängt dies jedoch nie. Muss ich Threading oder eine Event-Schleife einrichten oder etwas, um dies zu erfassen? – Charles

Antwort

2

Ich nehme an, Sie verwenden diesen UIhread nicht, wenn Sie Ihren Code in einem anderen Thread versuchen, wenn das der Fall ist. Allerdings kann es zu einer Reihe von Dingen in Beziehung gesetzt werden, beginnen Sie mit dem Bild selbst (da es leer/transparent ist), das, was ich benutze:

UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.opaque, [[UIScreen mainScreen] scale]); 
[view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); //after this you should see the image 

Die folgenden Kommentare beziehen sich auf Mozilla CoreAnimationDrawingModel plugin

(Ihr Black Box-Plugin könnte darauf basieren?)

Stellen Sie sicher, dass Sie Flash 10.1+ verwenden, da das Core Animation-Zeichnungsmodell vor dieser Version nicht unterstützt wird (Sie haben eine SWF-Datei geladen).

Hinweis! Wenn Ihr Blackbox-Plugin mit QTMovieLayer rendert, sollte es fehlschlagen, da es nicht mit renderInContext unterstützt wird.

Weitere interessante Lektüre über Ihr Thema (ab 2010): Core Animation