2009-05-10 13 views
0

J'essaie d'obtenir des variables de lecture d'une applet Java hors processus à partir de mon programme C#. En dehors de la lecture des adresses mémoire, est-il possible d'obtenir des valeurs de variables à partir d'une applet Java? Cette applet Java sera exécutée dans un navigateur. S'il n'est pas possible de le faire à partir de C#, serait-il possible de le faire à partir d'une autre applet java?Lire les variables Java

Merci.

Répondre

1

Si vous pouvez modifier le code de l'applet, vous pouvez avoir héberger un serveur RMI, qui fait l'objet de this excercise. Je ne suis pas un expert du sujet - je suppose qu'il peut être soumis à diverses restrictions de sécurité.

Si vous ne pouvez pas changer l'applet, mais vous pouvez changer la page HTML montrant l'applet, il y a deux façons d'accéder aux informations de l'applet. La première façon est de scripter l'applet avec Javascript comme le suggère @Margus (toutes les méthodes publiques de l'objet applet sont exposées via l'objet DOM de l'applet).

L'autre façon est de mettre une applet de votre choix dans la page, et d'utiliser getAppletContext() pour obtenir une référence à l'autre applet. Le principal avantage de cette manière est que vous pouvez accéder aux informations non publiques de l'applet tierce via la réflexion, et les publier avec un serveur RMI (comme ci-dessus).

-1

Non. Ce que vous essayez de faire est impossible à partir d'une applet Java ou de tout autre processus de langage.

0

Ce n'est pas possible du tout.

Les processus, par définition, ne partagent pas la mémoire, ni aucune autre ressource pour cela. C'est quelque chose qui est appliqué au niveau de l'OS, et vous ne pouvez rien faire à ce sujet.

Si cela était possible, vous ne pouvez qu'imaginer quel problème de sécurité/stabilité cela aurait pu être.

Si vous avez vraiment besoin d'une communication inter-processus, vérifiez la programmation de la socket dans votre langue. Notez que cela nécessitera des changements à la fois pour le client (votre applet Java) ainsi que pour le serveur (le processus C#).

+1

Vous pouvez lire une autre mémoire de processus à partir de presque toutes les langues. – Tom

+0

@Tom - est-ce vrai? Donnez-moi un exemple dans n'importe quelle langue de votre choix ... –

+0

Sur Windows, vous pouvez utiliser ReadProcessMemory (http://msdn.microsoft.com/en-us/library/ms680553(VS.85).aspx), bien sûr cela vous oblige à avoir des privilèges d'accès. – staffan

0

Vous pouvez accéder aux informations de l'exécution du processus Java (y compris dans un navigateur) si un JDK est installé et que vous exécutez une JVM ultérieure. Jetez un oeil à ces JDK tools.

2

Oui, cela peut être fait. La forme C# peut avoir le composant webbrowser hôte et peut déclencher JScript, et elle peut appeler des méthodes publiques de l'applet Java.

Il y a longtemps, j'ai créé une page Web simple, qui héberge une applet qui dessine une carte de couleur «chaude». L'entrée est injectée avec JScript, et peut être récupérée avec AJAX ou toute autre application qui peut déclencher JScript sur HTML DOM.

Source HTML est:

<HTML><HEAD></HEAD><BODY> 
<SCRIPT> 
function call() { 
    var inputData = "-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,0,1647,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,89,0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,0,0,615,366,0,1198,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,0,2179,1262,764,200,0,0,609,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,0,0,3401,1940,0,210,0,-1,-1,162,0,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,0,-1,966,0,86,0,0,0,0,-1,-1,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,-1,250,53,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-1,1977,1413,128,0,0,0,0,0,0,-1,1413,2447,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,0,-1,0,0,0,0,0,0,0,-1,317,0,-1,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,0,0,0,0,0,0,0,0,0,0,3246,2190,0,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,51,0,-1,0,0,0,-1,0,-1,0,-1,-1,1523,-2,-2,-2,-1,0,0,-2,-2,0,0,-2,-2,-2,-2,-2" 
     + ";-2,0,0,0,0,0,0,0,0,0,0,1692,2028,2850,-2,0,-1,0,0,0,0,0,0,0,-1,-2,-2,-2,-2" 
     + ";-2,0,0,0,0,0,-1,0,0,0,-1,1292,-2,-2,-2,0,0,-1,-1,0,0,0,0,0,-1,0,-2,-2,-2" 
     + ";-2,0,-1,0,0,-1,0,0,-1,0,1028,1247,7675,9244,7940,0,-1,0,0,-1,0,0,0,0,0,0,0,-2,-2" 
     + ";-2,-1,0,0,0,0,0,0,0,0,844,1114,2860,6631,4249,0,0,-1,-1,0,0,0,0,0,0,0,0,-2,-2" 
     + ";-2,-2,0,0,0,-1,0,-1,0,0,0,-1,1958,2379,-1,0,0,0,0,0,0,0,0,-1,0,0,0,-2,-2" 
     + ";-2,-2,-2,0,470,0,-2,-2,-2,0,0,0,-1,0,0,0,0,0,-1,0,-1,0,0,3574,2706,2195,-1,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,-1,-1,0,0,0,0,0,0,0,0,165,-1,-1,1282,867,0,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,-1,0,0,0,0,34,504,3098,2708,2324,-1,0,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,-1,0,0,0,0,0,0,0,0,0,721,-1,3854,2783,-1,0,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,-1,0,0,0,-1,0,34,191,2455,4126,0,0,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,0,0,0,0,0,0,3982,2656,0,0,-1,0,0,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,-1,0,0,2194,0,0,0,0,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,0,0,-1,0,0,-2,-2,-2,-2,-2,-2,-2" 
     + ";-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2,-2"; 
    document.Necrodrip.update(inputData); 
} 
</SCRIPT> 
<FORM> 
<APPLET CODE="kuningriik.pdApplet.class" 
     NAME="Necrodrip" 
     width="1200" height="600"> 
</APPLET><br/> 
<INPUT type="button" value="Loo kaart" 
    onClick = "call()"> 
</FORM> 
</BODY></HTML> 

Vous pouvez voir la page ici: link

0

C'est ce que le débogueur fait tout le temps, donc c'est clairement possible.Dans les versions récentes de Sun Java, vous attachez JVMTI (JVM Tool Interface) relativement facilement après le démarrage d'un processus. Cependant, ce n'est pas nécessairement très facile.

Si vous contrôlez la source de l'applet (ou même si vous ne le faites pas), il est probablement plus facile de partager des données via une connexion réseau.

Questions connexes