|
begin process at 2008 07 05 18:21:05
Derniers logiciels
|
Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
ACCÉDER À SON ORDINATEUR DEPUIS N'IMPORTE QUELLE MACHINE CONNECTÉE À INTERNET COMME SI C'ÉTAIT UN SITE WEB!
Information sur la source
Description
Alors voilà le concept: Imaginez que vous êtes chez un ami, votre ordinateur est allumé chez vous et connecté à Internet, et votre ami (qui a un mac par exemple) est lui aussi connecté à Internet. Et là, brusquement, vous auriez besoin de faire quelque chose à distance sur votre ordinateur, comme par exemple récupérer un fichier, lire vos mails, lancer un erveur réseau de Unreal Tournament ou même l'éteindre... Eh bien ce petit programme vous permet de faire tout cela en passant par une page web qui permet de contrôller votre ordinateur à distance. Il y a 3 fonctions principales: -Prendre le contrôle de la souris, et faire des captures d'écran répétées de ce qu'il y a sur votre moniteur [:D -Explorer vos fichiers comme avec l'explorateur de windows, télécharger ou uploader des fichiers [:O -Avoir une fenêtre comme la fenêtre MS-DOS dans laquelle vous pouvez tapper des commandes à distance et lire les résultats [:P Les seules conditions pour pouvoir l'utiliser sont: -Ne pas oublier de lancer le programme avant de partir de chez vous -Connaître votre addresse IP. Si pas exemple votre addresse IP est 123.456.789.123, il suffit de se connecter au site http://123.456.789.123 et le tour est joué! Evidemment, pour que tout le monde ne puisse pas faire impunément ce qu'il veut sur votre ordinateur, il y a une protection par mot de passe. Pour l'instant, le seul account est: Username=Feux et Password=666666. Pour le changer, il faut éditer la propriété "Accounts" du composant THTTPPasswordRequestFile qui est sur la fiche principale du projet, et vous pouvez réjoutter ou enlever des mots de passe. Simple, non? ATTENTION TOUTEFOIS A NE PAS LAISSER VOIR VOTRE PASSWORD PAR N'IMPORTE QUI, IL AURAIT ALORS ACCES A TOUT VOTRE ORDINATEUR!!!
Source
- Pour faire marcher le code, il faut déjà installer mon pack de composant FileSystem que vous pourrez trouver ici:
- http://www.delphifr.com/code.aspx?ID=27147
- Marche à suivre:
- -Installer FileSystem.dpk
- -Installer HTTPDistantAccess.dpk (inclus dans le zip de cette page)
- -Compiler le projet Project1.dpr
- -Le lancer.
-
- Lorsqu'on lance le projet, une fenêtre apparait, avec un bouton "Local test". Ce boutton permet de tester le server HTTP sur votre propre machine. C'est ce que j'ai fait lors de la capture d'écran, ce qui explique que l'image est récursive: la page web "photographiait" mon écran toutes les 2 secondes, puis se mettait à jour automatiquement, et ainsi de suite...
-
- J'ai testé mes composants JavaScript avec Netscape, ça a l'air de marcher à peu près, mais c'est moins joli qu'avec Internet Explorer.
Pour faire marcher le code, il faut déjà installer mon pack de composant FileSystem que vous pourrez trouver ici:
http://www.delphifr.com/code.aspx?ID=27147
Marche à suivre:
-Installer FileSystem.dpk
-Installer HTTPDistantAccess.dpk (inclus dans le zip de cette page)
-Compiler le projet Project1.dpr
-Le lancer.
Lorsqu'on lance le projet, une fenêtre apparait, avec un bouton "Local test". Ce boutton permet de tester le server HTTP sur votre propre machine. C'est ce que j'ai fait lors de la capture d'écran, ce qui explique que l'image est récursive: la page web "photographiait" mon écran toutes les 2 secondes, puis se mettait à jour automatiquement, et ainsi de suite...
J'ai testé mes composants JavaScript avec Netscape, ça a l'air de marcher à peu près, mais c'est moins joli qu'avec Internet Explorer.
Conclusion
Maintenant je vais parler des composants qui sont inclus dans le package.
J'ai déjà défini un nouveau type de collection (attention, il ne descend pas du TCollection de base de Delphi). C'est la classe TComponentCollection, qui descend de TPersistent. Sa particularité est de contenir des composants sans icône (qui sont enregistrés dans l'IDE via la fonction RegisterNoIcon de Delphi), et qui sont quand même accessibles depuis la fiche, comme par exemple les TMenuItem.
Ce type de collection a une propriété Owner, de type TComponent. Le composant Owner d'une collection doit implémenter l'interface IComponentCollectionOwner, qui a une seule fonction permettant d'accéder à la collection proprement dite. Les composants qui sont des items de la collection doivent implémenter l'interface IComponentCollectionItem, qui permet de retrouver l'Owner de la collection dont ils font partie, ce qui implique qu'un composant ne peut pas être un item de 2 collections différentes, et qu'un composant ne peut pas être l'owner de plusieurs TComponentCollection.
J'ai défini un descendant de TComponent qui implémente déjà toutes les méthodes nécessaires pour un IComponentCollectionItem, c'est la classe TComponentCollectionItem. J'ai programmé un property editor pour gérer les TComponentCollection, qui crée une arborescence (en effet, rien n'empèche un TComponentCollectionitem de posséder lui-même sa propre collection de composants :D)
Lorsqu'on programme un server Web, il faut gérer l'aspect Multithreading de la connection. C'est à dire qu'à chaque fois qu'un nouveau client se connecte, un nouveau thread de connection est créé du côté du server. C'est assez problématique avec Delphi, car la VCL n'est pas "thread-safe"...
Pour pallier à ce (petit) défaut, j'ai décidé de créer un descendant de TDataModule qui contient les données de chaque connection au serveur, c'est la classe TServerDataModule. Chaque instance est créée avec Owner=nil, ce qui permet d'éviter les problèmes de synchronisation de threads, et détruite dans le thread qui l'a créée. Dans la partie initialization de l'unité qui définit le descendant de TServerDataModule, il faut enregistrer la classe descendante avec un appel de la fonction RegisterClass. Pour créer un nouveau type de TServerDataModule, il faut aller dans le menu File->New->Other... puis choisir dans la rubrique HTTP l'item "Server data module". Ensuite, une nouvelle fiche de TDataModule est créée pas Delphi, avec une propriété publiée de type THTTPFiles.
Le composant principal du package HTTPDistantAccess est le composant THTTPDistantAccess. Il a une propriété qui est: ServerDataModuleClass, de type string. Il faut lui affecter un nom de classe de descendant de TServerDataModule valide. Cette classe est instanciée à chaque fois que le server HTTP initialise une nouvelle session.
Pour réaliser un serveur web, il faut ajoutter des HTTPFiles dans la propriété HTTPFiles du THTTPServerModule. J'en ai défini pusieurs classes:
-THTMLDocument: crée un document html. Voir plus bas. -THTTPDynamicGraphicFile: crée une image dynamiquement à chaque requête via un événement. Un autre événement sert à obtenir l'extension du graphique. -THTTPStaticGraphicFile: crée une image statique dont la donnée est dans les resources du programme. -THTTPDynamicFile: un document dynamique quelconque.
Le composant THTMLDocument est le plus important: c'est lui qui permet de faire des pages Web. Il publie une propriété HTMLObjects qui descend de TComponentCollection, et qui contient les objets qui apparaissent sur la page. Ces objets peuvent être de plusieurs types:
-THTMLRawCode: du code HTML brut, statique, stocké dans les resources du programme. -THTMLDynamicRawCode: la même chose, mais le code HTML est généré dynamiquement via un événement. -THTMLEdit: comme un TEDit, mais sur une page Web -THTMLButton, THTMLCombobox, THTMLListBox, THTMLMemo...: des contrôles HTML standards -THTMLGraphicObject: une image, avec une propriété HTTPGraphicFile qu'il faut relier à une THTTPGraphicFile comme défini plus haut. -D'autres encore que j'oublie et à venir.
Le principe est le suivant: on fait coopérer du code Javascript du côté du client avec le code Delphi du côté du server, de façon à ce que les événements et les propriétés des contrôles de la page Web soient réacheminés du côté du server. Ainsi, lorsqu'on définit un événement OnClick pour un THTMLButton, l'événement est lancé sur le server chaque fois que le client clique sur le bouton. De plus, si par exemple il y a un THTMLEdit sur la page et que le client en a modifié le contenu, la propriété Text correspondante du server est mide à jour. Ainsi, lorsqu'on programme la page Web du côté du server, on programme de la même façon que si les contrôles étaient des contrôles standard Delphi. Puissant, non?
J'ai testé mon programme avec Internet Explorer et avec Netscape, ça a l'air de fonctionner à peu près. J'ai eu du mal au début car les 2 browser n'utilisent pas la même gestion des événements.
Voilà, c'est tout pour l'instant pour les explications. Le code est encore en version Bêta, je l'ai commencé il y a seulement 4 jours, et dès que j'ai le temps je le commente.
En attendant, toute remarque ou commentaire seront les bienvenus.
Là encore, les composants ont été écrits avec Delphi 7, je ne sais pas s'ils seront compatibles avec les versions antérieures de Delphi. Est-ce que quelqu'un peut me dire s'il a réussi à les installer et à les faire marcher? Merci!
Historique
- 01 novembre 2004 18:11:20 :
- Juste une petite précision: si vous regardez l'unité ConsoleThread.pas, vous verrez qu'un autre processus externe est lancé: il s'agit du programme cmd de windows XP (la commande MS-DOS). Dans certains cas, lorsque par exemple vous quittez le programme du server avec alt+ctrl+suppr, il se peut que ce processus ne soit pas arrêté. Il faut alors l'arrêter manuellement avec alt+ctrl+suppr (il s'appelle "cmd" dans la liste). Sinon, lorsqu'on tente de lancer à nouveau le server, on obtient une erreur du genre:
"could not connect, address and port are already in use"
Bientôt, je mettrai une mise à jour pour connecter et déconnecter manuellement le server, pour l'instant le server se connecte dès qu'il est créé et se déconnecte lorsqu'il est détruit.
- 04 novembre 2004 02:09:42 :
- ATTENTION: pour que cette mise à jour fonctionne, il faut aussi mettre à jour le package FileSystem, sinon il se produit parfois des bugs lorsqu'on utilise la TFileSystemSaveDialog. La mise à jour est disponible sur la page où vous avez pu télécharger le package FileSystem la première fois:
http://www.delphifr.com/code.aspx?ID=27147
Bugs corrigés dans cette version:
-Aucun je crois, apparemment personne ne m'a dit s'il y en avait dans la version précédente. Ah si, j'oubliais: BenXbox m'a signalé que lorsqu'il installait le package puis ensuite essayait de compiler l'exe, Delphi lui disait qu'il n'arrivait pas à trouver les *.pas du packages utilisés dans l'exe. Ceci est je pense un bug de Delphi, je l'ai déjà rencontré dans des situations assez particulières, par exemple lorsqu'on change de répertoire le source d'un package déjà installé, et qu'on installe le nouveau source qui a changé de place. Dans ces cas là je crois avoir trouvé une solution: il faut remettre le package à l'endroit précédent, puis l'ouvrir avec Delphi, le retirer de la liste des packages installés. Ensuite, fermer Delphi, détruire le fichier .bpl correspondant dans le répertoire /bpl/ où Delphi stocke les packages installés dans l'IDE, changer le package de place, le réouvrir et le réinstaller. Bonne chance!
Sinon, on peut aussi rajoutter à la main les *.pas manquant au projet (Shif+F11) mais ça risque de le refaire à chaque fois que vous voudrez créer un nouveau projet qui utilise mes composants :-(
Modifications du package HTTPDistantAccess:
Apparemment ce n'était pas une bonne idée de faire descendre THTTPDistantAccess de TidCustomHTTPServer, car ce dernier publie malheureusement des événements qui n'ont aucun sens dans le contexte de mon composant, comme par exemple OnSessionStart. En plus, je les ai déjà utilisés pour autre chose. Donc la liste est la suivante:
-Ajout d'un TPropertyEditor pour la propriété HTTPServerModuleClassName: c'est toute la magie de Delphi en une page de code. Le property editor va scanner toutes les unités qui contiennent un Designer, et sélectionner uniquement les classes qui descendent de THTTPServerDataModule. Il prévient ensuite l'utilisateur qu'il faut enregister la classe avec RegisterClass dans son code.
-Ajout des propriétés les plus importantes du TIdHttpServer au THTTPDistantAccess. C'est bourrin mais ça marche.
-Gràce à la propriété Bindings et DefaultPort, on peut changer le mappage des adresses IP et des ports du server.
-Grâce à la propriété Active, on peut déconnecter ou reconnecter le server
-Ajout des événements OnStatus, OnServerOnLine, OnServerOffLine.
Modifications de l'exe: cette fois on a un server HTTP qu'on peut paramétrer avec pas mal d'options.
-Les options sont stockées dans un .ini, pour revenir aux options par défaut il suffit de détruire le fichier ini avant de lancer le programme.
-On peut forcer le server à se connecter au démarrage.
-On peut mettre lr programme en icone dans la barre des tâches. Il suffit de minimiser la fenêtre.
-On peut faire créer à distance sur un site FTP une page web qui contient un lien vers le server. Par exemple, si votre IP n'est pas fixe (c'est le cas pour l'ADSL wanadoo standard par exemple), vous pouvez ouvrir un compte HTTP gratuit (par exemple chez Free ou IFrance). Après, il suffit de mettre dans la propriété "FTP file name" le nom d'un fichier du FTP de votre compte. Par exemple, si vous ouvrez un compte chez IFrance, il suffit d'utiliser le TFileSystemSaveDialog en cliquant sur "...", de mettre l'host FTP: "ftp.ifrance.com", votre login et votre mot de passe, puis ensuite d'utiliser la boite de dialogue comme celle standard de windows.
ATTENTION parfois le programme ne fait rien pendant plusieurs secondes, ce n'est pas qu'il est bloqué, mais que le composant met parfois du temps à se connecter et est écrit pour fonctionner en mode "bloquant".
-On peut gérer les Accounts pendant l'exécution.
-Il y a un historique de ce qu'il se passe sur le server.
-La console MS-DOS est maintenant en blanc sur fond noir.
-Je crois que c'est tout!
Sources de la même categorie
Commentaires
|
|