Skip to content

C#

15 Topics 94 Posts

This category can be followed from the open social web via the handle [email protected]

Subcategories

  • [Tutoriel] Commencer à utiliser SQLite avec C#

    14
    0 Votes
    14 Posts
    22k Views
    vfrzV
    <p> Bonjour, bonsoir !<br/>  <br/> Aujourd'hui nous allons apprendre à utiliser <strong>SQLite </strong>en <strong>C#</strong>, pour cela je divise le tutoriel en trois grandes parties :<br/>  <br/> I • SQLite, c'est quoi ?<br/> II • Pour quelles utilisations ?<br/> III • Utiliser SQLite<br/>  <br/><span style="font-size:18px;"><u><strong>I • SQLite, c'est quoi ?</strong></u></span><br/>  <br/><strong>SQLite</strong> est une bibliothèque écrite en C qui propose un moteur de base de données relationnelle accessible par le langage <strong>SQL</strong>. <strong>SQLite </strong>implémente en grande partie le standard SQL-92 et des propriétés ACID.<br/>  <br/> Contrairement aux serveurs de bases de données traditionnels, comme <strong>MySQL </strong>ou <strong>PostgreSQL</strong>, sa particularité est de ne pas reproduire le schéma habituel client-serveur mais d'être directement intégrée aux programmes. L'intégralité de la base de données (déclarations, tables, index et données) est stockée dans un fichier indépendant de la plateforme.<br/>  <br/><strong>D. Richard Hipp</strong>, le créateur de <strong>SQLite</strong>, a choisi de mettre cette bibliothèque ainsi que son code source dans le domaine public, ce qui permet son utilisation sans restriction aussi bien dans les projets open source que dans les projets propriétaires. Le créateur ainsi qu'une partie des développeurs principaux de <strong>SQLite </strong>sont employés par la société américaine <strong>Hwaci</strong>.<br/>  <br/>  <br/><strong>SQLite </strong>est le moteur de base de données le plus distribué au monde, grâce à son utilisation dans de nombreux logiciels grand public comme <strong>Firefox</strong>, <strong>Skype</strong>, <strong>Google Gears</strong>, dans certains produits d'<strong>Apple</strong>, d'<strong>Adobe </strong>et de <strong>McAfee </strong>et dans les bibliothèques standards de nombreux langages comme <strong>PHP</strong> ou <strong>Python</strong>. De par son extrême légèreté (moins de 300 Kio), il est également très populaire sur les systèmes embarqués, notamment sur la plupart des smartphones modernes : l'<strong>iPhone </strong>ainsi que les systèmes d'exploitation mobiles <strong>Symbian </strong>et <strong>Android </strong>l'utilisent comme base de données embarquée. Au total, on peut dénombrer plus d'un milliard de copies connues et déclarées de la bibliothèque.<br/>  <br/><span style="font-size:12px;">(Source : Wikipedia)</span><br/>  <br/> Nous allons aujourd'hui nous intéresser au wrapper .Net de <strong>SQLite</strong>.<br/>  <br/>  <br/><strong><span style="font-size:18px;"><u>II • Pour quels utilisations ?</u></span></strong><br/>  <br/> Comme dit plus haut, <strong>SQLite </strong>permet d'accéder à une <strong>base de données</strong> uniquement en <strong>local</strong>, depuis un fichier, ce qui limite donc les utilisations. Vous pourrez utiliser cette librairie donc pour des projets locaux comme par exemple gérer un système de compte sur une seule machine, stocker des résultats de calculs ou encore stocker des scores pour un jeu solo... Cependant utiliser <strong>SQLite </strong>pour des jeux ou applications diverses en ligne n'est pas possible directement, il va falloir passer par un serveur.<br/>  <br/> Des connaissances sur le SQL sont fortement recommandées, si vous n'y connaissez rien, allez lire le tutoriel sur OpenClassRoom ou sur n'importe quel autre site.<br/>  <br/><span style="font-size:18px;"><u><strong>III • Utiliser SQLite</strong></u></span><br/>  <br/><u><strong>Importer la librairie</strong></u><br/>  <br/> Premièrement il va vous falloir la librairie, télécharger là ici : <a href="http://www.mediafire.com/download/53kb0zwdkw5od7o/System.Data.SQLite.dll" rel="external nofollow">System.Data.SQLite.dll</a><br/>  <br/> Une fois votre projet crée sous <strong>Visual Studio</strong>, importer cette librairie à votre celui-ci, pour cela, clic droit sur le projet puis "Importer une référence".<br/> Pour finir l'importation ajoutez ceci au début de la classe où vous voulez utiliser <strong>SQLite </strong>: </p> <pre class="ipsCode prettyprint lang-auto prettyprinted"> <span class="kwd">using</span><span class="pln"> </span><span>System</span><span class="pun">.</span><span>Data</span><span class="pun">.</span><span>SQLite</span><span class="pun">;</span></pre> <p>  <br/><strong><u>Créer un fichier de base de données</u></strong><br/>  <br/> Chaque base de données aura son propre fichier, pour créer un fichier de base de données, nous allons utiliser la méthode statique <strong>CreateFile </strong>contenue dans la classe <strong>SQLiteConnection </strong>: </p> <pre class="ipsCode prettyprint lang-auto prettyprinted"> <span>SQLiteConnection</span><span class="pun">.</span><span>CreateFile</span><span class="pun">(</span><span class="str">"MaBaseDeDonnees.sqlite"</span><span class="pun">);</span></pre> <p> J'utilise ici l'extention .sqlite, mais vous pouvez mettre ce que vous voulez ! (.db, .blabla)<br/>  <br/><u><strong>Connexion à la base de données</strong></u><br/>  <br/> Avant de pouvoir utiliser cette base de données, il va falloir se connecter à celle-ci, pour cela nous allons déclarer une nouvelle <strong>SQLiteConnection </strong>: </p> <pre class="ipsCode prettyprint lang-auto prettyprinted"> <span>SQLiteConnection</span><span class="pln"> maConnexion</span><span class="pun">;</span></pre> <p> Puis l'instancier et ouvrir la connexion : </p> <pre class="ipsCode prettyprint lang-auto prettyprinted"> <span class="pln">maConnexion</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>SQLiteConnection</span><span class="pun">(</span><span class="str">"Data Source=MaBaseDeDonnees.sqlite;Version=3;"</span><span class="pun">);</span><span class="pln"> maConnexion</span><span class="pun">.</span><span>Open</span><span class="pun">();</span></pre> <p> Pour fermer la connexion : </p> <pre class="ipsCode prettyprint lang-auto prettyprinted"> <span>MaBaseDeDonnees</span><span class="pun">.</span><span>Close</span><span class="pun">();</span></pre> <p> N'oubliez pas de la fermer une fois que vous n'en avez plus besoin </p> <p> <strong><u>Créer une table</u></strong> </p> <p> Désormais nous allons utiliser le <strong>SQL</strong>, nous allons créer une table qui contiendra les meilleurs scores pour un jeu, donc un nom de type "text" et un score de type "int" : </p> <pre class="ipsCode prettyprint prettyprinted"> <span class="kwd">string</span><span class="pln"> sql </span><span class="pun">=</span><span class="pln"> </span><span class="str">"create table meilleursscores (nom text, score int)"</span><span class="pun">;</span></pre> <p> Nous devons créer un objet de type <strong>SQLiteCommand </strong>pour pouvoir l'éxécuter : </p> <pre class="ipsCode prettyprint prettyprinted"> <span>SQLiteCommand</span><span class="pln"> commande </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>SQLiteCommand</span><span class="pun">(</span><span class="pln">sql</span><span class="pun">,</span><span class="pln"> maConnexion</span><span class="pun">);</span></pre> <p> Puis nous allons éxecuter cette commande : </p> <pre class="ipsCode prettyprint prettyprinted"> <span class="pln">command</span><span class="pun">.</span><span>ExecuteNonQuery</span><span class="pun">();</span></pre> <p> <strong><u>Remplir la table</u></strong> </p> <p> Nous allons maintenant remplir cette table comme ceci : </p> <pre class="ipsCode"> string sql = "insert into meilleursscores (nom, score) values ('VFRZ', 100)"; SQLiteCommand commande = new SQLiteCommand(sql, maConnexion); commande.ExecuteNonQuery();</pre> <p> <strong><u>Lire les meilleurs scores depuis la table</u></strong> </p> <p> Pour lire la table c'est un peu différent que pour la remplir ou la créer. </p> <p> Premièrement, la commande select : </p> <pre class="ipsCode prettyprint prettyprinted"> <span class="kwd">string</span><span class="pln"> sql </span><span class="pun">=</span><span class="pln"> </span><span class="str">"select * from meilleursscores order by score desc"</span><span class="pun">;</span><span class="pln"> </span><span>SQLiteCommand</span><span class="pln"> commande </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>SQLiteCommand</span><span class="pun">(</span><span class="pln">sql</span><span class="pun">,</span><span class="pln"> maConnexion</span><span class="pun">);</span></pre> <p> Puis il va falloir utiliser un <strong>SQLiteDataReader </strong>pour utiliser cette commande : </p> <pre class="ipsCode prettyprint prettyprinted"> <span>SQLiteDataReader</span><span class="pln"> reader </span><span class="pun">=</span><span class="pln"> command</span><span class="pun">.</span><span>ExecuteReader</span><span class="pun">();</span><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">reader</span><span class="pun">.</span><span>Read</span><span class="pun">())</span><span class="pln"> </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"Nom: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> reader</span><span class="pun">[</span><span class="str">"nom"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">"\tScore: "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> reader</span><span class="pun">[</span><span class="str">"score"</span><span class="pun">]);</span></pre> <p>   </p> <p> J'espère que ce tutoriel vous a été utile ! </p> <p> N'hésitez pas à poser des questions. </p> <p>   </p> <p> VFRZ </p>
  • Petit boue de code rigolo ! C Sharp

    5
    0 Votes
    5 Posts
    2k Views
    aurelien974A
    <p> <span style="color:rgb(0,0,0);font-family:Verdana, Arial, Helvetica, sans-serif;font-size:14.4px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:20.16px;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;float:none;background-color:rgb(255,255,255);">Salut, voilà je voulais poster se petit bout de code rigolo.  Après rigolo ou pas avoue juger. </span>:P </p> <p>   </p> <pre class="ipsCode prettyprint prettyprinted"> <span class="pln">  </span><span class="kwd">class</span><span class="pln"> </span><span>Program</span><span class="pln">     </span><span class="pun">{</span><span class="pln">         </span><span class="kwd">const</span><span class="pln"> </span><span>int</span><span class="pln"> </span><span>Fille</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">         </span><span class="kwd">const</span><span class="pln"> </span><span>int</span><span class="pln"> </span><span>Garcon</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">         </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span>Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">         </span><span class="pun">{</span><span class="pln">             </span><span>Random</span><span class="pln"> </span><span>LaLoidelaNature</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>Random</span><span class="pun">();</span><span class="pln">             </span><span>int</span><span class="pln"> </span><span>FilleouGarcon</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>LaLoidelaNature</span><span class="pun">.</span><span>Next</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">             </span><span>int</span><span class="pln"> </span><span>MamanOuPapa</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>LaLoidelaNature</span><span class="pun">.</span><span>Next</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">             </span><span>int</span><span class="pln"> </span><span>PapaOuMaman</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>LaLoidelaNature</span><span class="pun">.</span><span>Next</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">             </span><span>int</span><span class="pln"> pouetPouet </span><span class="pun">=</span><span class="pln"> </span><span>MamanOuPapa</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span>PapaOuMaman</span><span class="pun">;</span><span class="pln">             </span><span>int</span><span class="pln"> bebeOupas </span><span class="pun">=</span><span class="pln"> </span><span>PapaOuMaman</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span>MamanOuPapa</span><span class="pln"> </span><span class="pun">></span><span class="pln"> </span><span class="pln"> </span><span class="pun">?</span><span class="pln"> pouetPouet </span><span class="pun">:</span><span class="pln"> </span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">;</span><span class="pln">             </span><span>int</span><span class="pln"> resulta </span><span class="pun">=</span><span class="pln"> bebeOupas </span><span class="pun">></span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> bebeOupas </span><span class="pun">></span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">             </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">resulta </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">             </span><span class="pun">{</span><span class="pln">                 </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span>FilleouGarcon</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span>Fille</span><span class="pun">)</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>ConsoleColor</span><span class="pun">.</span><span>Magenta</span><span class="pun">;</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"Papa est Maman a fait pouet pouet est Maman à un bébé C'est une fille !"</span><span class="pun">);</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>ResetColor</span><span class="pun">();</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">                 </span><span class="kwd">else</span><span class="pln">                 </span><span class="pun">{</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>ConsoleColor</span><span class="pun">.</span><span>Blue</span><span class="pun">;</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"Papa est Maman a fait pouet pouet est Maman à un bébé C'est un garçon !"</span><span class="pun">);</span><span class="pln">                     </span><span>Console</span><span class="pun">.</span><span>ResetColor</span><span class="pun">();</span><span class="pln">                 </span><span class="pun">}</span><span class="pln">             </span><span class="pun">}</span><span class="pln">             </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">resulta </span><span class="pun">==</span><span class="pln"> </span><span class="pun">)</span><span class="pln">             </span><span class="pun">{</span><span class="pln">                 </span><span>Console</span><span class="pun">.</span><span>ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>ConsoleColor</span><span class="pun">.</span><span>White</span><span class="pun">;</span><span class="pln">                 </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"Papa est Maman a fait pouet pouet est Maman ! aucun bébé en vue !"</span><span class="pun">);</span><span class="pln">                 </span><span>Console</span><span class="pun">.</span><span>ResetColor</span><span class="pun">();</span><span class="pln">             </span><span class="pun">}</span><span class="pln">             </span><span class="kwd">else</span><span class="pln">             </span><span class="pun">{</span><span class="pln">                 </span><span>Console</span><span class="pun">.</span><span>ForegroundColor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span>ConsoleColor</span><span class="pun">.</span><span>Red</span><span class="pun">;</span><span class="pln">                 </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"HOOOO !! deux personnes de même du même sexe ne peux pas avoir d'enfants !"</span><span class="pun">);</span><span class="pln">             </span><span class="pun">}</span><span class="pln">             </span><span>Console</span><span class="pun">.</span><span>WriteLine</span><span class="pun">(</span><span class="str">"Taper sur une touche pour recommencer !"</span><span class="pun">);</span><span class="pln">             </span><span>Console</span><span class="pun">.</span><span>Read</span><span class="pun">();</span><span class="pln">             </span><span>Main</span><span class="pun">(</span><span class="pln">args</span><span class="pun">);</span><span class="pln">         </span><span class="pun">}</span><span class="pln"> </span></pre> <p>   </p>
  • [Guide] Apprendre le C#

    Pinned
    5
    0 Votes
    5 Posts
    7k Views
    vfrzV
    <p> Bonjour, </p> <p>   </p> <p> Aujourd'hui je vous liste plusieurs tutoriels, livres pour apprendre le C# de A à Z. </p> <p> La plupart des livres sont en anglais car les livres français sont généralement de moins bonne qualité. </p> <p>   </p> <p> <u><strong>Sur Melinyel :</strong></u> </p> <p>   </p> <p> • [Vidéo] C# de A à Z : </p> <p>     - Episode 1 • Introduction </p> <p>     - Episode 2 • Prérequis </p> <p>   </p> <p> <strong><u>Livres :</u></strong> </p> <p>   </p> <p> • TutorialsPoint C# Programming, livre au format PDF gratuit, très bien pour débuter et couvre pas mal d'aspect du C# (Anglais). </p> <p>     - Lien PDF : <a href="http://www.tutorialspoint.com/csharp/csharp_tutorial.pdf" rel="external nofollow">http://www.tutorialspoint.com/csharp/csharp_tutorial.pdf</a> </p> <p>   </p> <p> • C# 5.0 in a nutshell, un grand classique très complet (Anglais). </p> <p>     - Lien Amazon : <a href="http://www.amazon.fr/5-0-Nutshell-5e-Joseph-Albahari/dp/1449320104/" rel="external nofollow">http://www.amazon.fr/5-0-Nutshell-5e-Joseph-Albahari/dp/1449320104/</a> </p> <p>     - Lien PDF : <a href="https://drive.google.com/file/d/0B9v4gXG6wtN7NU4tVVFrVkJkUEU/view" rel="external nofollow">https://drive.google.com/file/d/0B9v4gXG6wtN7NU4tVVFrVkJkUEU/view</a> </p> <p>   </p> <p> • Pro C# 5.0 and the .Net 4.5 Framework, un livre très complet (Anglais). </p> <p>     - Lien Amazon : <a href="http://www.amazon.fr/Pro-5-0-net-4-5-Framework/dp/1430242337/" rel="external nofollow">http://www.amazon.fr/Pro-5-0-net-4-5-Framework/dp/1430242337/</a> </p> <p>     - Lien PDF : <a href="http://www.clicktocontinue.com/books/ProCSharp5AndTheNET4.5Framework.pdf" rel="external nofollow">http://www.clicktocontinue.com/books/ProCSharp5AndTheNET4.5Framework.pdf</a> </p> <p>   </p> <p> • Cours OpenClassRoom en format PDF (Français), bien pour débuter mais pas complet. </p> <p>     - Lien Amazon : <a href="http://www.amazon.fr/Apprenez-à-développer-en-C/dp/B00VALU8YG/" rel="external nofollow">http://www.amazon.fr/Apprenez-à-développer-en-C/dp/B00VALU8YG/</a> </p> <p>     - Lien PDF : <a href="https://user.oc-static.com/pdf/523498-apprenez-a-developper-en-c.pdf" rel="external nofollow">https://user.oc-static.com/pdf/523498-apprenez-a-developper-en-c.pdf</a> </p> <p>   </p> <p> • C# 6 et Visual Studio 2015 - Les fondamentaux du langage, je ne sais pas ce qu'il vaut, mais c'est un des rares livres en C# en français. </p> <p>     - Lien Amazon : <a href="http://www.amazon.fr/Visual-Studio-2015-fondamentaux-langage/" rel="external nofollow">http://www.amazon.fr/Visual-Studio-2015-fondamentaux-langage/</a> </p> <p>   </p> <p> <strong><u>Sites Web :</u></strong> </p> <p>   </p> <p> • Developpez, très complet. </p> <p>     - Lien : <a href="http://dotnet.developpez.com/csharp/" rel="external nofollow">http://dotnet.developpez.com/csharp/</a> </p> <p>   </p> <p> • OpenClassRooms, le fameux, plusieurs tutoriels sur le C# sont présents, bien pour débuter mais pas très complet (uniquement pour les débutants qui ne comprennent pas l'anglais, à éviter si possible). </p> <p>     - Apprenez à développer en C# : <a href="https://openclassrooms.com/courses/apprenez-a-developper-en-c" rel="external nofollow">https://openclassrooms.com/courses/apprenez-a-developper-en-c</a> </p> <p>     - Apprenez à développer en C# sur .Net : <a href="https://openclassrooms.com/courses/apprenez-a-programmer-en-c-sur-net" rel="external nofollow">https://openclassrooms.com/courses/apprenez-a-programmer-en-c-sur-net</a> </p> <p>     - Programmez en orienté objet avec C# : <a href="https://openclassrooms.com/courses/programmez-en-oriente-objet-avec-c" rel="external nofollow">https://openclassrooms.com/courses/programmez-en-oriente-objet-avec-c</a> </p> <p>   </p> <p> • Java2S, "catalogue" du C#, pleins d'exemples sur pleins de sujets. </p> <p>     - Lien : <a href="http://www.java2s.com/Tutorial/CSharp/CatalogCSharp.htm" rel="external nofollow">http://www.java2s.com/Tutorial/CSharp/CatalogCSharp.htm</a> </p> <p>   </p> <p> • RB Whitaker's Wiki, bien pour débuter. </p> <p>     - Lien : <a href="http://rbwhitaker.wikidot.com/c-sharp-tutorials" rel="external nofollow">http://rbwhitaker.wikidot.com/c-sharp-tutorials</a> </p> <p></p><p> Si vous avez des suggestions de livres/sites web, n'héistez pas </p> <p>   </p> <p> Bonne lecture et bon apprentissage ! </p> <p>   </p> <p> VFRZ, </p>
  • Les fichiers ZIP

    5
    0 Votes
    5 Posts
    5k Views
    D
    <p>Comme vous le savez surement, le framework .NET est une immense collection de classes que nous, les développeurs, utilisons pour créer nos programmes. Le framework est divisé en plusieurs Namespace, celui que nous utiliserons dans ce tutoriel est <a href="http://msdn.microsoft.com/en-us/library/system.io.compression(v=vs.110).aspx" rel="external nofollow">System.IO.Compression</a>.<br/> Il vous faudra donc ajouter deux références (Explorateur de solution -> Références -> Ajouter Référence)<br/></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><img alt="4e631291de.png" src="https://puu.sh/dYaA7/4e631291de.png"/></blockquote><p><br/> Puis vérifiez que les références ont bien été ajoutées:<br/></p><p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><img alt="2ac2a3d543.png" src="https://puu.sh/dYb2L/2ac2a3d543.png"/></blockquote><p><br/> Maintenant il ne vous reste plus qu'a ajouter un using tout en haut de votre code:</p> <pre class="ipsCode prettyprint lang-auto"> using System.IO.Compression; </pre> <p>(Nous utiliserons aussi les namespaces System et Sytem.IO)<br/>  <br/> Pour commencer, nous avons les fonctions de la classe statique <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx" rel="external nofollow">ZipFile</a> :<br/> -Prend tout les fichiers contenus dans le dossier "folder", puis les compresses dans le fichier "compressed.zip"</p> <pre class="ipsCode prettyprint lang-auto"> ZipFile.CreateFromDirectory("folder", "compressed.zip"); </pre> <p>Avec l'enumeration <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.zipfile(v=vs.110).aspx" rel="external nofollow">CompressionLevel</a>, il est possible d'optimiser la compression, sois pour la vitesse, sois pour la taille du fichier.<br/> -Extrait les fichiers contenus dans le fichier "compressed.zip" vers le dossier "folder"</p> <pre class="ipsCode prettyprint lang-auto"> ZipFile.ExtractToDirectory("compressed.zip", "folder"); </pre><p>Ces deux fonctions ont une surchage qui prend en compte l'encodage, l'encodage de base est UTF-8 donc si vous avez besoin d'un encodage différent, il vous suffit de le passer en paramètre.<br/>  <br/>  <br/> Maintenant passons au choses un peu plus complexes, la classe <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchive(v=vs.110).aspx" rel="external nofollow">ZipArchive</a> vas nous permettre d'avoir plus de contrôle sur notre archive. Cette classe implémente IDisposable, il faut donc l'entourer d'un bloc "using", ou manuellement appeler Dispose() quand vous avez fini de l'utiliser.<br/>  <br/> Tout d'abord, pour créer une instance ZipArchive, il faut ouvrir un Stream qui va nous permettre de lire le fichier. Cet exemple ouvre le fichier "test.zip". affiche le nom de tout les fichiers ainsi que le ratio de compression:</p> <pre class="ipsCode prettyprint lang-auto"> using (Stream fs = File.OpenRead("test.zip")) using (var archive = new ZipArchive(fs, ZipArchiveMode.Read)) foreach (ZipArchiveEntry entry in archive.Entries) Console.WriteLine("{0} : {1}%", entry.Name, Math.Ceiling((double)entry.CompressedLength / (double)entry.Length * 100)); </pre> <p> <br/> La classe ZipArchive nous permet de créer, de lire et aussi de mettre a jour des archives ZIP.<br/> -Création:</p> <pre class="ipsCode prettyprint lang-auto"> ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Create); </pre> <p>-Lecture:</p> <pre class="ipsCode prettyprint lang-auto"> ZipArchive archive = ZipFile.Open("name.zip", ZipArchiveMode.Read); // equivalent ZipArchive archive = ZipFile.OpenRead("name.zip");   </pre> <p>-Mise a jour:</p> <pre class="ipsCode prettyprint lang-auto"> ZipArchive archive = ZipFIle.Open("name.zip", ZipArchiveMode.Update);</pre> <p>Dans l'archive, chaque fichier est représenter par une <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.ziparchiveentry(v=vs.110).aspx" rel="external nofollow">ZipArchiveEntry</a>, qu'on peut obtenir grâce a la proprietee Entries de la classe ZipArchive.</p> <p>On peut récupérer un objet ZipArchiveEntry en choisissant un existant:</p> <pre class="ipsCode prettyprint"> var entry = archive.GetEntry("file.txt"); </pre> <p>Ou en créant une nouvelle:</p> <pre class="ipsCode prettyprint"> var entry = archive.CreateEntry("file.txt");</pre> <p>La classe ZipArchiveEntry contient des propriétés publiques qui exposent des informations a propos du fichier (nom, taille (et taille après compression), date de la dernière écriture ...)</p> <p>Elle contient aussi plusieurs fonctions tel que Delete (supprime le fichier de l'archive) et ExtractToFile(extrait le fichier compressé vers un fichier décompressé hors de l'archive).</p> <p> </p> <p>La fonction Open revois un objet Stream, qui va nous permettre de modifier directement le contenu du fichier.</p> <p>Exemple qui créé une archive "test.zip", et qui y ajoute le fichier "foo.txt". (c'est possible de le faire plus facilement en utilisant archive.CreateEntryFromFile, mais je vais utiliser cet exemple pour vous montrer comment utiliser l'objet Stream):</p> <pre class="ipsCode prettyprint">             using (ZipArchive archive = ZipFile.Open("test.zip", ZipArchiveMode.Create))             {                 var entry = archive.CreateEntry("foo.txt");                 using (Stream s = entry.Open())                 {                     byte[] data = File.ReadAllBytes("foo.txt");                     s.Write(data, 0, data.Length);                 }             } // Reouvre l'archive pour confirmer que le fichier est bien la, et affiche sa taille.             using(ZipArchive archive = ZipFile.OpenRead("test.zip"))             {                 var entry = archive.GetEntry("foo.txt");                 Console.WriteLine("Name: {0}\r\nOriginalSize: {1}\r\nCompressedSize: {2}",                     entry.Name, entry.Length, entry.CompressedLength);             } </pre> <p>Je pense avoir fait le tour du sujet, j’éditerais peut être avec une section a propos de la classe GZipStream (qui permet de compresser/décompresser en mémoire, sans fichiers).</p> <p>Je vais aussi écrire un petit tool qui permetra de gérer les fichiers ZIP en ligne de commande.</p> <p> </p> <p>N’hésitez pas si vous avez des questions, ou des remarques a faire !</p> <p> </p> <p>Davy</p>
  • NetZip

    2
    0 Votes
    2 Posts
    2k Views
    D
    <p>Hello, suite a mon récent tutoriel a propos des fichiers ZIP, j'ai eu envie de faire un petit projet pour tout mettre en pratique.</p> <p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""><img alt="fc7ebfc941.png" src="https://puu.sh/e7bkD/fc7ebfc941.png"/></blockquote><p></p><p>C'est un simple utilitaire en ligne de commande, conçu pour être facile a utiliser.</p> <p>Chaque commande (6 au total) exécute une action précise, et rien d'autre- vous pouvez aussi soumettre des arguments au commandes.</p> <p> </p> <p>Liste des commandes/ sous commandes</p> <p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""> <pre> Get file in main args[0] [1]: Main command [2,3 ...]: main command args -l list : List all files -s : List file sizes -cs: List compressed file sizes -e extract [folderName]: Extract to folder [folderName] (if used: Unzipped(x))) -a add [fileName]: Add a file to the archive -d: Adds a directory -d delete [entryName]: Delete [entryName] from archive -d: Deletes a directory -c create [ToAdd]: Create a new entry -d: Creates archive with a directory h help [command]: Displays help about the command</pre> <p></p></blockquote><p></p><p>Lors du lancement, il faut spécifier un chemin vers le fichier .zip (exception: la commande help), puis le nom du fichier sera sauvegarder dans la mémoire du programme donc le même fichier sera utiliser automatiquement pour les commandes suivantes, jusqu’à ce qu'un nouveau fichier sois spécifier ou la fermeture du programme.</p> <p> </p> <p>Exemples d'utilisations:<br/>  </p> <blockquote class="ipsQuote" data-ipsquote=""><div> <p>netzip foo.zip list // Liste le contenu de l'archive "foo.zip"</p> <p>netzip foo.zip extract folder // Extrait le contenu de l'archive "foo.zip" vers le dossier "folder"</p> <p>netzip foo.zip add test.txt // Ajoute le fichier "test.txt" a l'archive "foo.zip"</p> <p>netzip foo.zip delete test.txt // Supprime le fichier "test.txt" de l'archive "foo.zip"</p> <p>netzip foo.zip create test.txt // Creer une nouvelle archive "foo.zip", et ajoute le fichier "test.txt" dedans</p> <p>netzip help // Affiche la liste des commandes et une bref description</p> <p>netzip help create // Affiche la documentation de la commande "create"</p> </div></blockquote> <p> </p> <p>Je l'ai dev assez rapidement pendant le weekend a la fin des vacances, donc j'aurais besoin de retour pour pouvoir corriger des bugs le plus vite possible.</p> <p> </p> <p>GitHub: <a href="https://github.com/DavyWk/NetZip" rel="external nofollow">https://github.com/DavyWk/NetZip</a></p> <p>DL:<a href="http://davydavek.olympe.in/Projects/NetZip/NetZip.exe" rel="external nofollow">http://davydavek.olympe.in/Projects/NetZip/NetZip.exe</a></p> <p>VT: <a href="https://www.virustotal.com/en/file/c5d32b2918c8c5f532e292ce676067c6ff31d9020b9d2c3bfe082a5660772e91/analysis/1420844336/" rel="external nofollow">https://www.virustotal.com/en/file/c5d32b2918c8c5f532e292ce676067c6ff31d9020b9d2c3bfe082a5660772e91/analysis/1420844336/</a></p> <p> </p> <p>Davy</p>
  • POPLib

    17
    0 Votes
    17 Posts
    4k Views
    D
    <p>Hello,</p> <p> </p> <p>Comme vous devez surement le savoir, il n'y a pas d’implémentation du protocole POP (Post Office Protocol) dans le framework .NET. J'ai donc créer une librairie qui contient quasiment tout le protocole (sauf la commande APOP).</p> <p> </p> <p>La source est disponible sur GitHub (GPL v3): <a href="https://github.com/DavyWk/POP-Lib" rel="external nofollow">https://github.com/DavyWk/POP-Lib</a></p> <p>Téléchargement: <a href="http://davydavek.olympe.in/Projects/POPLib.dll" rel="external nofollow">http://davydavek.olympe.in/Projects/POPLib.dll</a></p> <p> </p> <p>Pour commencer a l'utiliser c'est très simple,</p> <pre class="ipsCode prettyprint"> using POP; var client = new POP3Client("pop.gmail.com", 995, true); // Serveur POP de Gmail avec SSL </pre> <p>Pour se connecter:</p> <pre class="ipsCode prettyprint"> client.Connect(); // initialise la connexion avec le serveur client.Login("[email protected]", "password"); </pre> <p>Et a la fin, n'oubliez pas de disposer de l'objet :</p> <pre class="ipsCode prettyprint"> client.Dispose(); </pre> <p>J'ai mis de la doc XML pour presque tout les fonctions publiques, mais si vous avez un problème/ une question, n’hésitez pas a demander.</p> <p> </p> <p>Davy</p>
  • Conversion en SHA-256

    2
    0 Votes
    2 Posts
    2k Views
    MihawkM
    <p>Bonsoir ! </p> <p> </p> <p>Voilà, actuellement j'ai un problème avec une conversion d'une de mes variables en sha-256, ce qui me bloque complètement pour la suite de mon programme.</p> <p>J'aimerais un résultat équivalent à celui là (prenons l'exemple de : test)</p> <p> </p> <p>9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08</p> <p> </p> <p>Hors, le résultat que j'obtient avec mon script actuel est quelque chose de similaire à ça :</p> <p> </p> <p>/lIGdrGh2T2rqyMZ7qA2dPNjLq7rFj0eiCRPXrHeEOs=</p> <p> </p> <p>Autant vous dire que ce n'est pas bon .. x)</p> <p> </p> <p>Il me faut impérativement un résultat avec des lettres en minuscules, ce que je n'arrive pas à obtenir avec de nombreuses tentatives, voilà le bout de programme qui me fait le conversion.</p> <pre class="ipsCode prettyprint"> SHA256Managed hash = new SHA256Managed(); byte[] hashvalue = hash.ComputeHash(new UnicodeEncoding().GetBytes(s)); string hashresultat = System.Convert.ToBase64String(hashvalue); Console.Write(hashresultat); </pre> <p>Est-ce que quelqu'un parmi vous aurait une idée ? car là je suis un peu bloqué.</p> <p> </p> <p>Merci d'avance ! </p>
  • Aide sur une méthode complexe.

    3
    0 Votes
    3 Posts
    4k Views
    aurelien974A
    <p>Salut, voila je travail sur un System de ai, Donc j'ai une méthode qui me permet de savoir si une phrase pour ressembler a une autre.</p><p></p><p>je voudrais savoir, et comment ou proposer votre technique, pour améliorer cette méthode.</p><p></p><pre class="ipsCode prettyprint lang-auto"> private int comparison(string text_A, string text_ { int i = 0; int Chance = 0; string[] text_A_split = text_A.Split(new char[] { ' ' }); string[] text_B_split = text_B.Split(new char[] { ' ' }); if (text_A_split.Count() - 1 > i && text_B_split.Count() - 1 > i) { foreach (string entry_A in text_A_split) { int firstCharacter = text_B_split[i].IndexOf(entry_A[i]); i++; Chance = Chance + firstCharacter; } } return Chance; } </pre>Pour le tester<p></p><pre class="ipsCode prettyprint lang-auto">MessageBox.Show("" + comparison("Aurelien et ici hahah", " Hahah aurelien et ici lol")); </pre>ça renvoie 2 qui signifie que 2 mots son identique. Je voudrais le pousser un peux plus.<p></p><p>Si elle deviens très gros la méthode c'est pas grave. c'est un peux le moteur du System on va dire.</p><p></p><p>cordialement moi.</p>
  • Soucis d'ouverture de port via mon launcher.

    14
    0 Votes
    14 Posts
    3k Views
    MihawkM
    <p>Voilà !</p> <p>Comme je l'ai dis dans ma présentation, j'ai besoin d'aide sur un point qui m'est complètement étranger... afin de mieux situer le problème laissez moi vous expliquer.</p> <p> </p> <p>Je créer un serveur actuellement d'un jeu (S4L) qui me génère pas mal de problèmes. Dont un, qui pour être réglé, nécessite l'ouverture normalement manuelle des ports sur le routeur (le fait qu'on ne voit personne une fois en jeu .. oui c'est problématique..)</p> <p>Une fois les ports ouvert, les joueurs sont de nouveau visible, c'est pourquoi j'essai de les ouvrir directement sur le launcher (qui reste ouvert, mais caché, une fois le jeu lancé, jusqu'à la fermeture du jeu), pour que grâce à L'upnp, je puisse commander l'ouverture de ces ports.</p> <p>Hors, moi sur mon routeur, quand je vais dans le menu pour l'upnp, je vois que rien ne change (donc je ne sais absolument pas si l'ouverture est bien prise en compte)</p> <p> </p> <p>Voilà le bout de programme qui me sert à les ouvrir (normalement):</p> <pre class="ipsCode prettyprint"> private void DeviceFound(object sender, DeviceEventArgs args) { INatDevice device = args.Device; device.CreatePortMap(new Mapping(Protocol.Udp, 6112, 6112)); device.CreatePortMap(new Mapping(Protocol.Udp, 38915, 38915)); device.CreatePortMap(new Mapping(Protocol.Udp, 38917, 38917)); device.CreatePortMap(new Mapping(Protocol.Udp, 28002, 28002)); device.CreatePortMap(new Mapping(Protocol.Udp, 28008, 28008)); device.CreatePortMap(new Mapping(Protocol.Udp, 28013, 28013)); device.CreatePortMap(new Mapping(Protocol.Tcp, 6112, 6112)); device.CreatePortMap(new Mapping(Protocol.Tcp, 38915, 38915)); device.CreatePortMap(new Mapping(Protocol.Tcp, 38917, 38917)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28002, 28002)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28008, 28008)); device.CreatePortMap(new Mapping(Protocol.Tcp, 28013, 28013)); foreach (Mapping portMap in device.GetAllMappings()) { // label1.Text = "Test ouverture du port" +(portMap.ToString()); } IPAddress externalIP = device.GetExternalIP(); } private void DeviceLost(object sender, DeviceEventArgs args) { INatDevice device = args.Device; } </pre> <p>Voilà, en espérant avoir été assez clair sur le problème rencontré .. (et surtout, est-ce que le programme est correct, et que c'est juste moi qui ai un soucis avec cette ouverture ? au niveau de mon routeur qui pourtant accepte l'upnp, j'ai orange avec un livebox pour la fibre optique.) </p>
  • SharpMail

    2
    0 Votes
    2 Posts
    2k Views
    vfrzV
    <p>Yo tout le monde !</p> <p> </p> <p>Suite à un manque d'imagination, j'ai décidé de créer une petite librairie qui va vous permettre d'envoyer des mails en C# plus simplement et plus rapidement.</p> <p> </p> <p>Lien de téléchargement : <a href="http://goo.gl/ytgu24" rel="external nofollow">http://goo.gl/ytgu24</a> (Release + Source v0.1) </p> <p>Lien de la source : <a href="http://goo.gl/biU3s6" rel="external nofollow">http://goo.gl/biU3s6</a> (Github) </p> <p> </p> <p>Utilisation :</p> <p>1) Ajouter la référence au projet</p> <p>2) Importer la librairie avec : </p> <pre class="ipsCode prettyprint"> using SharpMail; </pre> <p>3) Désormais vous pouvez envoyer des emails comme ceci :</p> <pre class="ipsCode prettyprint"> SharpMail.Mail.SendMail("smtp.yourserver.com", "[email protected]", "[email protected]", "subject", "message", "[email protected]", "creditential_password", "Mail send !"); </pre> <p>Certes ce n'est pas forcément très utilie mais comme je vous l'ai dit, je ne suis pas très inspiré en ce moment...</p> <p>J'espère quand même que ca peut être utile à quelqu'un !</p> <p> </p> <p>A+</p> <p> </p>
  • POP Client

    3
    0 Votes
    3 Posts
    2k Views
    D
    <p>Hello,</p> <p> </p> <p>Comme vous avez du le voir dans <iframe data-embed-src="<base_url>/topic/1086-poplib/,?do=embed" data-embedcontent="" frameborder="0" src="//melinyel.net/applications/core/interface/js/spacer.png"></iframe> j'ai créer une librairie qui permet d’interagir avec un serveur en utilisant le protocole POP3 (qui permet de recevoir des mails). Pour la mettre en pratique, j'ai donc créer un client mail en console.</p> <p>Ce projet est une POC, et donc n'est pas destiné a un usage quotidien. (Ne supporte pas les mails en MIME, les fichiers joints, et quelques mails qui ont un format "spécial" > possibilité de crash)</p> <p> </p> <p>[liste des commandes]</p> <p> </p> <p>Pour commencer a l'utiliser, lancez la commande 'help', qui vous afficheras une liste de toute les fonctions disponibles ainsi que leur description. Pour avoir plus d'information (format, arguments ..) a propos d'une commande utilisez 'help [commande]'.</p> <p>Entrez 'x' suivi d'espace pour quitter.</p> <p> </p> <p>Téléchargement: <a href="http://davydavek.olympe.in/Projects/POP3 Client.rar" rel="external nofollow">http://davydavek.olympe.in/Projects/POP3 Client.rar</a> (laissez la DLL dans le même dossier que l’exécutable)</p> <p>Source: <a href="https://github.com/DavyWk/POP3-Client" rel="external nofollow">https://github.com/DavyWk/POP3-Client</a></p> <p> </p> <p>Je ne sais pas quoi ajouter, donc je vais conclure ici :lol: </p> <p> </p> <p>Davy</p>
  • DatMemory

    6
    0 Votes
    6 Posts
    2k Views
    D
    <p>Une petite librairie que j'avais écrit a l’époque ou je m’intéressait au gamehacking, je vient de la réécrire donc pourquoi ne pas la partager </p> <p> </p> <p>Cette libraire vous permet de modifier la mémoire (et de changer sa protection) d'un autre programme avec facilitée.</p> <p> </p> <p>[Documentation arriveras plus tard .. ou pas]</p> <p> </p> <p>Projet sur GitHub: <a href="https://github.com/DavyWk/DatMemory" rel="external nofollow">https://github.com/DavyWk/DatMemory</a></p> <p>DL : <a href="http://davydavek.olympe.in/Projects/DatMemory.dll" rel="external nofollow">http://davydavek.olympe.in/Projects/DatMemory.dll</a></p> <p>VT: <a href="https://www.virustotal.com/en/file/c774392e8f086c0be187cef83e483cb673d6f48bc3d06bfd4a6b6f77192a4f00/analysis/1408282227/" rel="external nofollow">https://www.virustotal.com/en/file/c774392e8f086c0be187cef83e483cb673d6f48bc3d06bfd4a6b6f77192a4f00/analysis/1408282227/</a></p>
  • PE Explorer

    12
    0 Votes
    12 Posts
    3k Views
    D
    <p style="text-align:center;"><u><strong><span style="font-size:18px;">PE Explorer</span></strong></u></p> <p style="text-align:center;"> </p> <p>Au départ c’était donc un petit logiciel, codé rapidement en C++, que j'avais fait pour mieux comprendre le format de fichier PE.</p> <p>[Le format PE (Portable Executable) un format de fichier créer par Microsoft, qui est donc utilisé par TOUT les .exe/.dll/.sys (exécutables, librairies dynamiques & drivers) sur Windows.(pour les plus curieux, <a href="http://msdn.microsoft.com/en-us/library/ms809762.aspx" rel="external nofollow">voici un article</a> a propos ce format)]</p> <p> </p> <p>Mais le code était littéralement horrible, je l'ai donc re codé en C#. Vu que je n'avais pas accès au <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms680198(v=vs.85).aspx" rel="external nofollow">structures prédéfinies </a>dans winnt.h, j'ai du tout réécrire manuellement, ce qui je vous l'avoue était chiant, mais aussi très enrichissant.</p> <p></p><p>Comme dit plus haut, il n'est pas forcement utile, mais je l'ai surtout fait pour apprendre. Vous pouvez le comparer a l'utilitaire <a href="http://msdn.microsoft.com/en-us/library/c1h23y6c.aspx" rel="external nofollow">DUMPBIN</a> (qui affiche des informations a propos d'un fichier PE).</p> <p> </p> <p>Screen (ce n'est pas la version finale) :</p> <p></p><blockquote class="ipsStyle_spoiler" data-ipsspoiler=""> <p><img alt="8be3b53727.png" src="http://puu.sh/9vsPC/8be3b53727.png"/></p> <p></p></blockquote><p></p><p>TODO:</p> <p><strike>-Parser l'import table</strike></p> <p><strike>-Parser l'export table</strike></p> <p><strike>-Afficher le subsystem (CUI, WIn32,driver ...)</strike></p> <p>- ? (je prend toute les suggestions !)</p> <p> </p> <p>Pour l'utiliser il suffit de drag 'n drop un fichier dessus.</p> <p> </p> <p>Lien de téléchargement :(v 1) <a href="http://davydavek.olympe.in/Projects/PE_Explorer.exe" rel="external nofollow">davydavek.olympe.in/Projects/PE_Explorer.exe</a></p> <p>VirusTotal : <span style="font-size:12px;background-color:rgb(247,247,247);">VirusTotal : </span><a href="https://www.virustotal.com/en/file/351c7da56a7b4189dc47f2f10921f584dbd5c3480b85761c5b5aa928620a12ed/analysis/1403985438/" rel="external nofollow">https://www.virustotal.com/en/file/351c7da56a7b4189dc47f2f10921f584dbd5c3480b85761c5b5aa928620a12ed/analysis/1403985438/</a></p> <p>Repo GitHub : <a href="https://github.com/DavyWk/PE-Explorer" rel="external nofollow">github.com/DavyWk/PE_Explorer</a></p> <p></p><p>Je m'excuse d'avance pour cette présentation pourrie  </p> <p> </p> <p>Davy</p>
  • Lancer un processus et rediriger sa sortie

    2
    0 Votes
    2 Posts
    3k Views
    D
    <p></p><p>Dans ce petit tutoriel destiné au débutants, je vais vous montrer comment lancer un processus, et rediriger sa sortie.</p><p> "cmd.exe" et la commande "tasklist" seront utilisé dans cet exemple, a vous de l'adapter selon vos besoins !</p><p><em>J'utiliserais le C#, mais vous pouvez le "traduire" en VB très facilement.</em></p><p></p><p><strong>Prérequis</strong></p> <ul><li>Bases du C#</li> <li>Créer un projet de type ConsoleApplication</li> </ul><p style="text-align:center;"><strong>Qu'est-ce qu'un processus ?</strong></p> <p></p><p>  Pour simplifier, c'est le nom donné par Windows au exécutables qui sont entrain de tourner. (ex: chrome.exe |  cmd.exe | Skype.exe ....)</p><p> Pour les voir il vous suffit de cliquer sur démarrer et puis d'entrer " taskmgr" (Task Manager).</p><p></p><p style="text-align:center;"><strong><a href="http://msdn.microsoft.com/en-us/library/System.Diagnostics(v=vs.110).aspx" rel="external nofollow">System.Diagnostics</a></strong></p> <p></p><p> Ce namespace contient des structures/classes qui vont nous permettre d'interagir avec d'autres processus (et d'autres choses mais on ne va s'en préoccuper durant ce tutoriel)</p><p> Pour l'importer:</p><p>  </p> <pre class="ipsCode prettyprint lang-auto"> using System.Diagnostics; //en haut de votre fichier .cs</pre> <p> </p><p> On va maintenant procéder a la 1ère partie de ce tutoriel : Créer un processus. Pour cela, nous allons utiliser les classes <a href="http://msdn.microsoft.com/en-us/library/vstudio/System.Diagnostics.Process(v=vs.110).aspx" rel="external nofollow">Process</a> et <a href="http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo(v=vs.110).aspx" rel="external nofollow">ProcessStartInfo</a></p><p>  </p><p> On commence par créer une instance de la classe ProcessStartInfo comme ceci:</p><p>  </p> <pre class="ipsCode prettyprint lang-auto"> ProcessStartInfo psi = new ProcessStartInfo {      FileName = "cmd.exe",   // Nom du processus (ici nous n'avons pas besoin de spécifier le chemin car cmd.exe est situé dans les dossiers du systeme.      Arguments = "/c tasklist",  // Commande a exécuter, le /c dit a l’interpréteur de commande "exécute xxx commande et casse toi", tasklist est le nom de la commande qui permet de lister tout les processus actifs.      RedirectStandardOutput = true,  // Pour dire qu'on va rediriger la sortie      UseShellExecute = false,  // Dit a l'OS de démarrer le processus directement a partir de l’exécutable }; </pre> <p> </p><p> Puis on lance le processus  :</p><p>  </p> <pre class="ipsCode prettyprint lang-auto"> Process p = Process.Start(psi); // Le processus se lance avec les informations de la classe ProcessStartInfo qu'on vient de créer.</pre> <p> </p><p> Pour récupérer la sortie (output) du processus, on utilise la propriété <a href="http://msdn.microsoft.com/en-us/library/vstudio/system.diagnostics.process.standardoutput(v=vs.110)" rel="external nofollow">Process.StandardOutput.ReadToEnd</a></p><p>  </p> <pre class="ipsCode prettyprint lang-auto"> string output = p.StandardOutput.ReadToEnd(); // on le stocke dans une variable de type string</pre> <p> </p><p> Avant d'afficher la sortie sur notre console, nous allons attendre que le processus se termine, en spécifiant un timeout (durée maximum d'attente)</p><p>  </p> <pre class="ipsCode prettyprint lang-auto"> p.WaitForExit(10000); // dix secondes Console.WriteLine(output); //écrit la sortie sur notre console Console.ReadKey(); //pause pour qu'on ai le temps de lire ce qui est sur notre console</pre> <p></p><p style="text-align:center;"><strong>Épilogue</strong></p> <p></p><p>Voila, ce court tutoriel est terminé, j’espère qu'il aura aidé certains d'entre vous.</p><p> Il y a  des millions d'autre choses possible, vous pouvez rediriger la sortie de votre console vers un fichier texte (en utilisant <a href="http://msdn.microsoft.com/en-us/library/system.console.setout(v=vs.110).aspx" rel="external nofollow">Console.SetOut</a> ), ou encore vers la console de Visual Studio. La seule limite est votre imagination.</p><p>  </p><p> Questions/Commentaires/Critiques sont toujours les bienvenus, sur ce post ou en MP.</p><p></p><p>Davy.</p> <p></p><p> PS: Sur QWERTY, désolé pour le manque d'accents.</p> <p> </p> <p>PS2: Les quelques lignes qui sont supposée être en gras ne le sont pas.</p>
  • Utiliser DLLImport

    2
    0 Votes
    2 Posts
    3k Views
    D
    <div> <p><em>Ce tutoriel n'est pas destiné au débutants, mais plutôt a ceux qui ont déjà de l’expérience en C# ou VB.NET </em></p> </div> <div> </div> <div> <p><strong><span style="font-size:18px;">DLL ... what ?</span></strong></p> </div> <div> </div> <div>Les DLLs (Dynamic-Link Library) sont des fichiers non-exécutables, qui contiennent des fonctions pouvant être utilisée par d'autres applications.</div> <div> </div> <div>Windows fonctionne justement avec des DLLs (%windir%\system32\ pour ceux qui voudrait les voir).</div> <div> </div> <div>Les principales sont : </div> <div>-user32.dll (User inferface (MessageBox, Bouttons, etc ...))</div> <div>-kernel32.dll (Fichiers, Mémoire, Processus/threads etc...)</div> <div>-gdi32.dll (Graphiques) </div> <div> </div> <div>Ces DLL forment ce qu'on appelle l'<a href="http://msdn.microsoft.com/en-us/library/windows/desktop/hh447209(v=vs.85).aspx" rel="external nofollow">API* Windows</a>, ou l'API* Win32.</div> <div> </div> <div>*API : Application Programming Interface</div> <div>NB: Il y a aussi ntdll.dll, qui contient l'API Native de Windows.</div> <div> </div> <div>Dans ce tutoriel je vais donc vous apprendre a importer les fonctions FindWindow et FlashWindow, exportées par user32.dll .</div> <div> </div> <div> </div> <div> </div> <div> <p><strong><span style="font-size:18px;">DLLImport</span></strong></p> </div> <div> </div> <div>Pour importer ces fonctions, on va utiliser DLLImport, il requiert la classe <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.aspx" rel="external nofollow">DLLImportAttribute</a>, dans le namespace <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.aspx" rel="external nofollow">System.Runtime.InteropServices</a> :</div> <div> </div> <div> <pre class="ipsCode prettyprint lang-auto"> using System.Runtime.InteropServices;</pre> </div> <div> </div> <div>Description des paramètres :</div> <div>-string <strong>dllName</strong> : Le chemin vers la DLL, et son nom. (On va utiliser une DLL de windows donc on n'a pas besoin de spécifier le chemin)</div> <div> </div> <div>-bool <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute.bestfitmapping(v=vs.80).aspx" rel="external nofollow"><strong>BestFitMappig</strong></a> (par défaut true) : Permet de convertir les caractères UNICODE en ANSI, si il est true alors la conversion utilise le caractère ANSI le plus proche (best fit).</div> <div> </div> <div>-CallingConvention <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.callingconvention(v=vs.80).aspx" rel="external nofollow"><strong>CallingConvention</strong></a> (par défaut CallingConvention.StdCall/Winapi) : Un membre de l'enum <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention(v=vs.110).aspx" rel="external nofollow">CallingConvention</a>, c'est assez low-level, donc je ne vais pas l'expliquer ici, vous pouvez lire la doc si vous en avez envie.</div> <div> </div> <div>-CharSet <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.charset(v=vs.80).aspx" rel="external nofollow"><strong>CharSet</strong></a> (par défaut CharSet.Ansi) : En fait certaines fonctions ont deux types. Par exemple MessageBoxA, et MessageBoxW. Pour importer MessageBoxA il faut utiliser Charset.Ansi, et pour MessageBoxW, Charset.Unicode. , L'Ansi, sauvegarde chaque caractère dans un byte, ce qui fait qu'il n'y a que 256 caractère disponibles (dictionnaires "basique" : francais/anglais ...), Charset.Unicode utilise deux bytes (DBCS), ce qui permet d’accéder a 65,536 (256<sup>2</sup>) caractères. (arabe/chinois/coréen etc..)</div> <div> </div> <div>-string <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.entrypoint(v=vs.80).aspx" rel="external nofollow"><strong>EntryPoint</strong></a> : Le nom de la fonction que vous voulez importer.</div> <div> </div> <div>-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.exactspelling(v=vs.80).aspx" rel="external nofollow"><strong>ExactSpelling</strong></a> (par défaut false en C# mais true en VB) : Si true, vous devez nommer la fonction avec son nom exact (en incluant le A/W, si nécessaire).</div> <div> </div> <div>-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.preservesig(v=vs.80).aspx" rel="external nofollow"><strong>PreserveSig</strong></a> (par défaut true) : Quand c'est true, la fonction retourne un integer, et quand c'est false, elle retourne une void. Quand une void autre que S_OK (aussi appelé 0, NULL, ERROR_SUCCESS), une exception est lancée. L'exception correspond au code d'erreur. Si la fonction retourne un int autre que 0, vous pouvez gérer l'erreur comme vous le souhaitez.</div> <div> </div> <div>-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.setlasterror(v=vs.80).aspx" rel="external nofollow"><strong>SetLastError</strong></a> (par défaut false) : Si y'a une erreur durant l'utilisation de la fonction, on peut utiliser Marshal.GetLastWin32Error pour obtenir le code de l'erreur (error code)</div> <div> </div> <div>-bool <a href="http://msdn.microsoft.com/en-US/library/system.runtime.interopservices.dllimportattribute.throwonunmappablechar(v=vs.80).aspx" rel="external nofollow"><strong>ThrowOnUnmappableChar</strong></a> (par défaut false) : Si c'est a true et qu'une erreur survient durant la conversion des caractères d'UNICODE a ANSI, ça envoie une exception. Sinon ça remplace le caractère par un '?'.</div> <div> </div> <div> <p>Oui y'a beaucoup de paramètres, mais ils sont rarement tous utilisé en même temps.</p> </div> <div> </div> <div><strong><span style="font-size:18px;">Plateform Invoke</span></strong> <p> </p> </div> <div> </div> <div>DLLImport fait partie de la plateforme Invoke (PInvoke).</div> <div> </div> <div>Pour trouver les prototypes des fonctions qu'on veut utiliser, il faut se rendre sur le Microsoft Developer Network (MSDN).</div> <div> </div> <div>Par exemple pour <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx" rel="external nofollow">FindWindow</a>, le prototype est : (en C)</div> <div> <pre class="ipsCode prettyprint lang-auto"> HWND WINAPI FindWindow(   In_opt  LPCTSTR lpClassName,   In_opt  LPCTSTR lpWindowName );</pre> </div> <div> </div> <div>Mais on ne peut pas utiliser les types des lib C en C# ... Donc on doit les 'traduire'.</div> <div>Un superbe site pour ça : <a href="http://www.pinvoke.net/index.aspx" rel="external nofollow">pinvoke.net</a></div> <div> </div> <div><strong>Attention ! Ce site ne contient pas les prototypes de TOUTE les fonctions, n’hésitez pas a utiliser Google.</strong></div> <div> </div> <div>Pour FindWindow le prototype serait donc :</div> <div> </div> <div> <pre class="ipsCode prettyprint lang-auto"> static extern IntPtr FindWindow(string lpClassName, string lpWindowName);</pre> </div> <div> </div> <div> <p><strong><span style="font-size:18px;">Un peu de pratique ...</span></strong></p> </div> <div> </div> <div>Ouvrez Visual Studio, on va commencer a coder. (ah bah enfin ...  )</div> <div><em>Ouvrez aussi une application ayant un titre facile a écrire, j'utiliserait Paint.</em></div> <div> </div> <div>Comme dit précédemment : <pre class="ipsCode prettyprint lang-auto"> using System.Runtime.InteropServices; // Le 'DLLImport' est habituellement placé au début d'une classe, ou encore dans une classe spécifique.    [DLLImport("user32.dll", SetLastError = true)] static extern IntPtr  FindWindow(string lpClassName, string lpWindowName);  //On utilisera lpWindowName, lpClassName restera null.   [DllImport("user32.dll", SetLastError = true)]         static extern bool FlashWindow(IntPtr hwnd, bool bInvert); //hwnd est l'handle (quelque chose que Windows utilise pour identifier des objets) de la fenêtre, qu'on récupère grâce a FindWindow. </pre> </div> <div> </div> <div>Puis après on fait notre propre code :</div> <div> </div> <div> <pre class="ipsCode prettyprint lang-auto"> string sWindowName =  "Untitled - Paint";  IntPtr hWindow = FindWindow(null,sWindowName); // Je préfère utiliser le nom de la fenêtre, donc je place le premier argument a null.       int error = Marshal.GetLastWin32Error(); // Un peu d'error-checking, la liste des ErrorCodes peut être trouvée ici : SystemErrorCodes             if (error == 0)             {                 FlashWindow(hWindow, true);                   error = Marshal.GetLastWin32Error();                 if (error == 0)                     Console.WriteLine("{0} flashed !", sWindowName);                 else                    Console.WriteLine("ErrorCode = {0}", error);              }                   else                Console.WriteLine("ErrorCode = {0}", error); // Si il y a une erreur, affiche l'erreur. </pre> </div> <div> </div> <div> </div> <div> </div> <div> <p><strong><span style="font-size:18px;">End</span></strong></p> </div> <div> </div> <div>Bon bah voila, je pense que j'ai tout dit sur les bases du DLLImport. Pour plus de lecture : <a href="http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.dllimportattribute_fields(v=vs.110).aspx" rel="external nofollow">DLLImport Attribute</a></div> <div> </div> <div>Je n'ai montré que deux API (fonctions dans les DLL de windows), il y en a DES CENTAINES, liste disponible sur le MSDN : <a href="http://msdn.microsoft.com/library/windows/desktop/hh920508(vs.85)" rel="external nofollow">Windows API Index</a></div> <div> </div> <div>Petit projet qui montre quelques trucs possible avec l'api Windows :</div> <div>-<a href="http://davydavek.olympe.in/Tutoriels/DLLImport/WindowsControl.exe" rel="external nofollow">WindowsControl.exe</a> (<a href="https://www.virustotal.com/fr/url/4d5d82b9c51dd413829f12744e526e0a091d0ea757f40968f7df94d2126f7922/analysis/1400792009/" rel="external nofollow">scan VirusTotal</a>)</div> <div>-<a href="http://davydavek.olympe.in/Tutoriels/DLLImport/WindowsControl.rar" rel="external nofollow">Source</a> (sans l’exécutable, vous devez le compiler vous-même)</div> <div> </div> <div>Si vous avez des questions, des commentaires etc. , n’hésitez pas a les poster ici.</div> <div> </div> <div>En espérant que ça vous aie plu,</div> <div> </div> <div>Davy.</div>