developper un petit exe pour windows

developper un petit exe pour windows - API Win32 - Programmation

Marsh Posté le 09-09-2014 à 18:46:57    

Bonjour,
Je dois ecrire un petit programme facilement transportable pour windows qui calcul via un algo maison un mot de passe à partir d'un code.
Je suis habitué à ecrire du code en php et python.
J'ai ecrit un programme sous petit mais la gestion des bibliothèque et la génération d'un exe leger  via py2exe s’avère compliqué.
 
Que pourriez vous me conseiller qui ne serait pas une usine à gaz  ?

Reply

Marsh Posté le 09-09-2014 à 18:46:57   

Reply

Marsh Posté le 09-09-2014 à 20:17:51    


Si tu veux un langage qui a le minimum de dépendance sous Windows, il n'y pas beaucoup de choix: C ou C++. Comme il n'y a pas grand chose d'installé en standard sous windows, quasiment tous les autres langages vont se trimbaler des runtimes assez mamouthesques.
 
Et ça exclu aussi Visual Studio, qui par défaut utilise le runtime C/C++ de visual studio (bon, normal tu me diras), sauf qu'il n'est pas installé en standard. Le déploiment n'est pas trivial si tu t'y connais pas et si tu choisi la voie de la facilité (vcredist.exe), tu verras que c'est aussi bloat que py2exe. Tu peux forcer VS à utiliser le runtime C/C++ de windows, mais bon courage pour configurer ça (utiliser le DDK au lieu du SDK, yay!).
 
Bref, le seul environnement qui fonctionne direct avec le minimum de dépendance, c'est : MinGW (Minimalist GNU for Windows: un port natif de gcc sous Windows). Les programmes générés par MinGW sont compatibles à partir de windows 2000.
 
Code::Blocks (un IDE dans la même veine que Visual Studio) inclu une version de MinGW dans son installeur.
 
Cela dit, il y a intérêt que ça en vaille la peine: si tu ne t'y connais pas en C/C++, il va y avoir du boulot (donc du temps) pour se familiariser avec ça.

Reply

Marsh Posté le 10-09-2014 à 08:49:32    

Merci pour tes conseils,
je suis donc parti a bloc avec Code::Blocks et minGW
Les deux fonctionnent sous linux (ubuntu pour moi) et windows :sol:  
Le C quand tu viens de python, c'est chaud, notamment pour le travail des chaînes de caractères.
Comment orienter son choix vers C ou C++ ? :??:

Reply

Marsh Posté le 10-09-2014 à 10:52:56    

A priori, C++ est un meilleur choix de nos jours, sauf cas spéciaux, vu les bibliothèques standard fournies avec.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-09-2014 à 12:37:50    

Code::Blocks et minGW est un excellent choix.
 
Pour moi, personnellement, myself, le C est beaucoup plus facile que le C++.
Il y a juste quelques petites choses à comprendre :
 
- Une chaine de caractères doit se terminer par un zéro binaire. La longueur de la chaine n'est mémorisée nulle part, contrairement à ce qui se passe pour beaucoup d'autres langages. La longueur en C, est le nombre d'octets jusqu'à la rencontre d'un caractère nul.
- Il faut savoir qu'une fonction retourne la valeur d'un nombre entier. Une fonction ne peut pas retourner une chaine ou un tableau. Elle peut rendre l'adresse d'une chaine. La solution consiste à passer en paramètre par adresse les données qui vont être changées par une fonction, car les paramètres peuvent être passés par valeur ou par adresse.
- Il faut savoir que le signe étoile "*" a plusieurs significations et qu'il y a parfois des confusions avec le signe du crochet "[". Si on ne sait pas, on regarde des exemples qui marchent.
- Il faut distinguer le signe égal "=" et le double signe égal "==".
- Une donnée globale ou une fonction doit être redéclarée en indiquant "extern" quand elle est utilisée dans un autre fichier.
- Il ne faut pas utiliser typedef, enum, malloc, free, scanf, et les tableaux à plusieurs dimensions. Ces choses ne servent à rien dans la vraie vie.
- Pour la gestion des fichiers, il faut utiliser la famille de fonctions qui commence par "f" (fopen, fclose, fread, fwrite, fgets, fputs, ftell, fseek) et savoir la différence entre le mode texte et le mode binaire.
 
Voilà, avec ces connaissances, on peut programmer tout ce qu'on veut, sans que l'exécutable ne soit gros, avec un code simple, lisible et rapide.

Reply

Marsh Posté le 10-09-2014 à 13:49:28    

Citation :

- Une donnée globale ou une fonction doit être redéclarée en indiquant "extern" quand elle est utilisée dans un autre fichier.


Pour un prototype de fonction, le mot extern est possible, mais ne fait rien de spécial, et dans la pratique, on ne l'emploie pas pour les prototypes. Quand à employer une variable globale qualifiée avec extern, c'est de la programmation de l'age de pierre (sauf cas spéciaux comme des variables en registres hardware) et écrire deux accesseurs à la get/set est ce qui se fait couramment.  
 

Citation :

- Il ne faut pas utiliser typedef, enum, malloc, free, scanf, et les tableaux à plusieurs dimensions. Ces choses ne servent à rien dans la vraie vie.

[:charles k:5]  
On doit pas avoir la même vie!
typedef est particulièrement utile lorsqu'il est suivi de struct, malloc/free idem quand tu alloues des tableaux de structures (bref des records), et les tableaux a deux dims, s'il veut faire du traitement d'image, euh...
Par contre, les enums et scanf, oui, on peut s'en passer.
 

Citation :

le C est beaucoup plus facile que le C++

Bof, pour les choses de base, non.
 
A+,


Message édité par gilou le 10-09-2014 à 14:01:59

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-09-2014 à 15:37:24    

effectivement les traitements des chaînes quand on vient de python :sweat:  
d'ailleurs je voudrais faire et parcourir un tableau de chaine je partais la dessus mais je sens l'impasse:
 char liste_rne[802]={'0950024K','0950050N','0950051P','0950052R','0950053S','0950056V','0950058X','0950059Y',.....}

Reply

Marsh Posté le 10-09-2014 à 15:52:17    

Mouais, le C / C++ sont assez hardcore comme langages. Va falloir lire quelques tutoriaux si tu veux te lancer là dedans. Sans un minimum de connaissance tu vas t'en prendre plein la figure (ie: crash, buffer overflow, stack overflow, undefined behavior, ...).
 
Une autre approche possible serait de regarder le langage LUA: il a un runtime très réduit (200 ou 300Ko de mémoire) et syntaxe/API beaucoup plus proche de python que du C/C++. C'est un langage qui a été prévu pour être embarqué avec des performances plutôt pas mal.
 
Si tu tiens vraiment à continuer en C/C++, va falloir commencer par les bases. Ta ligne de code montre que tu ne les as pas.

Reply

Marsh Posté le 10-09-2014 à 17:56:41    

isanaud a écrit :

effectivement les traitements des chaînes quand on vient de python :sweat:  
d'ailleurs je voudrais faire et parcourir un tableau de chaine je partais la dessus mais je sens l'impasse:
 char liste_rne[802]={'0950024K','0950050N','0950051P','0950052R','0950053S','0950056V','0950058X','0950059Y',.....}


Code :
  1. #include <iostream>
  2. #include <string>
  3. #include <array>
  4. int main()
  5. {
  6.     std::array<std::string, 802> liste_rne = {
  7.         "0950024K", "0950050N", "0950051P", "0950052R",
  8.         "0950053S", "0950056V", "0950058X", "0950059Y",};
  9.    
  10.     std::cout << "Le contenu de liste_rne est:" << std::endl;
  11.     for (auto x:liste_rne) std::cout << x << std::endl;
  12.     // imprimera 802 lignes, dont les 794 dernières vides  
  13.     return 0;
  14. }


A compiler avec les flags activant le C++11
A+,


Message édité par gilou le 10-09-2014 à 18:03:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 10-09-2014 à 21:52:57    

Bon, je m'en suis tiré avec une chaine de 8000 caracteres que je découpe en chaînes de 9 caractères.
L'exe est fonctionnel et fait 30 ko :pt1cable:  
Code::Blocks + MinGW forment un couple exceptionnel et c'est tellement simple à installé sous ubuntu !
Dommage qu'on soit limité au c ou c++  :(  
Merci pour vos conseils ! :jap:


Message édité par isanaud le 10-09-2014 à 22:18:36
Reply

Marsh Posté le 10-09-2014 à 21:52:57   

Reply

Marsh Posté le 12-09-2014 à 10:16:10    

isanaud a écrit :

effectivement les traitements des chaînes quand on vient de python :sweat:  
d'ailleurs je voudrais faire et parcourir un tableau de chaine je partais la dessus mais je sens l'impasse:
 char liste_rne[802]={'0950024K','0950050N','0950051P','0950052R','0950053S','0950056V','0950058X','0950059Y',.....}


Le problème vient des apostrophes qui ont été mises alors qu'il fallait des guillemets pour des chaines.
Désolé de l'avoir oublié dans ma liste de recommandations.
 
En C, et C++, une apostrophe est utilisée pour un seul caractère. Par exemple 'a'. Il n'y a qu'un seul octet qui est réservé en mémoire. On ne peut pas écrire 'ab'. Mais on peut écrire '\n', car c'est le caractère spécial pour le retour à la ligne.
Mais le guillemet a un comportement différent. Par exemple "a". Cela réserve deux octets, dont le premier est rempli par la lettre a, et le second est rempli par un caractère nul.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed