Sto lavorando a un eseguibile daemon autonomo che deve caricare un plug-in NPAPI di terze parti esistente su un computer host. Quello che voglio fare è rendere le viste generate dal plugin a una trama/superficie.Problemi nel caricamento di un plug-in NPAPI nell'app Mac
Deve funzionare su Mac e Windows, ma poiché sono un utente Mac pesante, ho deciso di creare prima la versione Mac. Non abbiamo il codice sorgente per questo plug-in - è qualcosa che un fornitore esterno ci ha fornito - quindi è un'implementazione black box.
Sul Web, il plug-in funziona in modo molto simile al flash. Si incorpora un'area in una pagina Web collegata a un certo tipo di imitazione (l'applicazione/flash) e che carica il plug-in, che a sua volta istruirà il plugin per caricare un determinato file (si pensi a un file SWF) e quindi renderlo.
Quello che sto facendo in questo momento è:
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.
Dal NPERR_NO_ERROR è la risposta attesa, sto assumendo questi tre passi sono stati completati con successo.
Durante NPP_New, il plug-in richiede sia il modello di evento Cocoa che la modalità di animazione Core Animation (o in alternativa, Core Graphics, se restituisco false per Core Animation).
Poi chiamo:
4. NPP_SetWindow
5. Once the window is set, I load an online file with CURL, and call NPP_NewStream/WriteReady/Write and DestroyStream.
Da quello che sono riuscito a trovare nella documentazione NPAPI, i/WriteStream/etc funzioni NewStream fondamentalmente caricare un file nella memoria del plugin, in modo che possa essere reso.
Il plug-in supporta Core Animation e Core Graphics in un browser e funziona perfettamente con i browser che supportano i plug-in NPAPI.
Una volta eseguito quanto sopra, cerco di eseguire il rendering su una texture, ma continuo a ricevere risposte false dalle chiamate alla funzione NPP_Event con un CGContextRef in modalità grafica principale. Quando si esegue in modalità Core Animation, rendo la texture a una bitmap utilizzando renderInContext ma l'intera immagine rimane vuota/trasparente.
È un campo lungo, ma qualcuno ha qualche idea?
Ci sono altre chiamate provenienti dal plugin nel tuo "pagina"? Hai chiamato e richiesto il root NPObject dal plugin?Potrebbe esserci qualcosa che il plug-in si aspetta che tu non abbia ancora fornito – taxilian
Come faccio a capire che cosa esattamente devo fornire al plugin? Durante NPP_New vengono chiamate dal plugin una tonnellata di funzioni NPN (alcuni Get/SetValue, Invoke, Evaluate) nel browser "falso". Ritorna NPObjects sulla base della mia migliore ipotesi su ciò che deve essere restituito. Dopo tentativi ed errori (il plugin si spegnerebbe se gli oggetti restituiti non fossero del tipo corretto), NPP_New restituirà infine NO_ERR. Non ho chiamato il root NPObject dal plugin (sebbene il plugin richieda il NPObject root dal browser durante NPP_New). Ma cosa dovrei fare con quell'oggetto? – Charles
Ok, ho impostato un logger plug-in proxy. Quando si carica il plugin tramite Firefox, sembra che sia stato ricevuto un evento NPN_GetURLNotify dopo che NPP_New ha restituito NO_ERR correttamente. Tuttavia, la mia app C++ non lo riceve mai. Devo impostare il threading o un ciclo di eventi o qualcosa per catturarlo? – Charles