2010-09-10 21 views
7

E 'possibile utilizzare qualsiasi meccanismo IPC per chiamare un ++ api c da Adobe Flash ActionScript? Ci sono dei buoni esempi?La comunicazione tra C++ e ActionScript 3

Aggiornamento: Ho in primo luogo voglio per applicazioni desktop ora cioè di Adobe/o tempi di esecuzione del desktop anyuone altro le

risposta

0

tutto dipende da ciò che il "API chiamate" si riferiscono a sei. Se si riferiscono ai meccanismi IPC , generalmente la risposta è no. È possibile compilare il codice , ma non si avrà l'implementazione per supportare queste chiamate. Se si utilizza i socket, è possibile implementare il supporto per che in Flash anche se al momento non Alchemy sostegno del socket() API. Questa guida è ?

via

0

Qualche tempo fa ho letto sul supporto ActiveX in flash. Forse potresti scrivere un wrapper ActiveX attorno al tuo C++ Api e chiamarlo in questo modo. Con Air 2.0 hai un'altra possibilità: puoi invocare programmi esterni. Se scrivi un wrapper a riga di comando attorno alla tua API, puoi chiamarlo in questo modo.

+0

Mi piace la tua soluzione Air 2.0, mi potete indirizzare ad alcuni semplici esempi di codice? – iceman

+0

@iceman vedere qui: http://mchristoff.com/2009/12/using-the-air-2-0-nativeprocess-api-to-control-mplayer/ http://www.adobe.com/ devnet/air/flex/quickstart/interacting_with_native_process.html –

2

Non dal flash player, in quanto sarebbe molto probabile violare il suo modello di sicurezza. È possibile chiamare C++ da Tamarin VM, che ad esempio sta facendo mod-actionscript. Un'opzione sarebbe quella di passare le chiamate a un server AS3, chiamare alcune funzioni C++ e inviare il risultato. Un'altra opzione è cross-compilare il codice C++ in AVM2 usando alchemy. Ma se si desidera chiamare C++ per accedere alle funzionalità sul computer client non disponibili da Flash Player (accesso al file system, UDP o altro), non c'è modo.

edit:
Ok, suppongo che ci sono le seguenti opzioni:

  • dare un'occhiata al pacchetto flash.accessibility e risolvere con AS3 solo
  • creare un demone di C++ in esecuzione in background , che può avere comunicazione bidirezionale con il flash tramite
    • un socket locale (si connetterebbe una porta nel daemon e il client flash si connetterebbe ad esso) con un protocollo personalizzato
    • un LocalConnection. Questo sembra un po 'meglio dal punto di vista AS3, ma richiede un po' di hacking sul lato C++, in quanto è necessario per entrare in possesso della connessione e implementare il protocollo (puntatori here)
  • utilizzare un tempo di esecuzione alternativa: Adobe AIR , zinco, swhx (richiede haXe e il "backend" è neko, ma neko può essere facilmente esteso)
+0

@ back2dos: quindi quello che stai dicendo è che posso usare il linguaggio as3, ma un lettore flash diverso da Adobe ?? quali sono quelli disponibili? – iceman

+0

@iceman: beh, c'è lightpark, che è open source, quindi suppongo che potresti modificarlo per le tue esigenze. A parte questo, non vedo opzioni. Forse, se hai spiegato, cosa stai cercando di ottenere, potrei essere di maggiore aiuto. – back2dos

+0

@ back2dos: sto progettando di rendere più accessibili le app desktop interattive ... quindi combini la ricca interfaccia utente di Flash e la potenza di codifica del C++ .. quindi voglio usare un motore di sintesi vocale per leggere all'utente ciò che è scritto sullo schermo .. – iceman

2

Non è possibile dal browser-player. Da un'applicazione AIR, è possibile utilizzare Socket API per eseguire IPC.

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/net/Socket.html?allClasses=1

+0

grazie mille, lo voglio principalmente per le app desktop ora ... conosci qualche API di alto livello rispetto all'API socket per comunicare tra C++ e as3/mxml? – iceman

+1

Per quanto ne so IPC significa socket/memoria condivisa/msgq ecc. Quindi, secondo il tuo bisogno, solo la cosa supportata è Socket. Qualsiasi valore superiore a questi IPC sarà più lento e non necessario, ad es. livelli più alti di socket sono http ecc., che potresti non voler usare. – Seeker

2

Se il target del runtime Adobe AIR, è possibile sfruttare la NativeProcess API che è stato introdotto in AIR 2.0.Questa API ti consente di generare processi esterni e comunicare con loro tramite stdin e stdout.

Se ti senti avventuroso e vuoi fare qualcosa di non documentato e completamente non supportato, puoi sfruttare gli interni di LocalConnection interagendo con il file mappato in memoria di Flash Player. Ulteriori dettagli sono disponibili sul sito osflash.org/localconnection. Questo approccio ha alcune limitazioni e non è supportato. Non lo consiglio

Come menzionato in altre risposte, è anche possibile utilizzare una connessione socket per inviare/ricevere dati.