Tester si un fichier est exécutable & extraire ses paramètres

maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 - 27 août 2004 à 19:09
maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 - 30 août 2004 à 09:33
Bonjour à tous,

Je bute depuis quelques heures sur un problème.

J'aimerais pouvoir tester si un fichier est un fichier exécutable ou non.

J'ai bien trouvé sur internet des exemples permettant de connaître le type d'exécutable (et donc, de déterminer si un fichier l'est ou pas : exécutable Win16, Win32, DOS, POSIX... ou inconnu et donc présumé non-exécutable), mais ces exemples repose souvent sur la fonction GetBinaryType issue de l'API Windows, qui, à ma connaissance, ne fonctionne pas sous Win 9x/Me.

Et, pour un exemple compatible 9x/Me, il me faudrait taper plusieurs dizaines de lignes de code, ça ne doit pas être très optimisé.

Une astuce (fiable ?) consisterait à extraire l'extension du nom de fichier et de regarder s'il s'agit de l'extension exe, com, pif ou bat pour déterminer si le fichier est exécutable.

Mais je ne peux pas procéder de cette façon pour la simple et bonne raison que je ne parviens pas à extraire l'extension si le nom de fichier que je veux tester comporte des paramètres, par exemple : "c:\Windows\notepad.exe /paramètre1 -paramètre2".

J'aimerais donc savoir si vous connaissez, d'une part :

- une méthode fiable pour extraire l'extension d'un nom de fichier contenu dans une chaîne avec des paramètres comme je vous ai donné en exemple ; par fiable, j'entends qu'elle tiendrait compte de certaines subtilités, comme :

* le fait que le nom de fichier puisse se trouver entre guillemets, s'il contient des espaces, exemple : "mon fichier.exe" /paramètre1

* ou qu'il comporte plusieurs points pouvant être confondus avec le séparateur d'extension, exemple : fichier.exe.bak

*etc.

Ce serait une fonction similaire à la fonction ParamStr de Delphi que je voudrais, mais qui puisse le faire pour une chaîne de type String (ParamStr ne travaille que sur la ligne de commande utilisée pour lancer le programme).

- et d'autre part, une meilleure méthode pour tester si un fichier est réellement exécutable (càd. qui puisse être exécuté par l'ancienne commande WinExec de Delphi, ou la commande "Open" d'un fichier Autorun.inf par exemple, sans passer par la fonction ShellExecute de l'API Windows),
sans vérifier son extension comme je l'ai proposé plus haut ?

Désolé pour la complexité de la question, mais j'ai cherché pendant des heures sur le net et j'ai rien trouvé de simple (la plupart des exemples proposent des fonctions qui se contentent "seulement" de nous dire de quel type d'exécutable il s'agit) :-(

Ce que je cherche surtout à savoir, c'est comment tester si un fichier est un exécutable... je trouverai plus facilement la réponse à ma question concernant les paramètres, en me servant des routines de manipulation de chaînes (mais c'est lourd et pas passionnant à programmer :-)

Si vous voulez plus de détails (s'il en est encore besoin...) n'hésitez pas à demander.

Merci infiniment pour votre aide !

Amicalement,
Maxime

6 réponses

cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010
29 août 2004 à 19:35
Salut,

Pour faire ce que tu souhaite, je pense que tu n'a pas d'autre solution que d'ecrire une fonction utilisant les routines de manipulation des chaines, par exemple en travaillant sur un ou plusieurs buffers et en supprimant les parametres (identifiés generalement par "/" ou "-"), ensuite tu peut extraire l'extension du fichier et la comparer a une liste prédéfinie.
Ainsi tu pourra recuperer a la fois les differents parametres et l'extension du fichier.

Mais tout depend de la finalité de ton projet, peut etre y a t-il un solution differente et plus simple pour faire ce que tu souhaite?

saib
0
maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 1
29 août 2004 à 20:29
Salut,

En fait je bosse sur la nouvelle version de mon logiciel Rapid'Autorun qui comme son nom l'indique permet de créer des fichiers AutoRun.inf comme ceux que l'on trouve sur la plupart des CD-ROM.

C'est le fichier AutoRun.inf qui permet de lancer une application lorsqu'on insère le CD dans le lecteur. Il peut contenir soit l'instruction Open qui permet de ne lancer que des fichiers exécutables, soit ShellExecute pour ouvrir des documents quelconques avec le programme associé. Ces instructions sont l'équivalent des fonctions WinExec et... ShellExecute en Delphi.

Mon logiciel propose donc à l'utilisateur de créer des fichiers AutoRun permettant de lancer un fichier lorsqu'il est lu par Windows à l'insertion du CD. Et je voudrais un code qui permette à mon logiciel de détecter, selon la ligne de commande indiquée par l'utilisateur, s'il doit écrire dans le fichier AutoRun.inf, l'instruction ShellExecute ou l'instruction Open pour ouvrir le fichier indiqué, en sachant que cette commande saisie par l'utilisateur peut être n'importe quoi, par exemple :

C:\Windows\Notepad.exe
install\setup.exe /autorun
doc\install\lisezmoi.txt
"Mon Fichier avec espaces.bat"

Car, en fait, ce qu'indique l'utilisateur peut être un chemin complet ou relatif, pointant vers un fichier exécutable (exemples 1, 2 et 4, donc utilisation de l'instruction Open) ou vers un document, non exécutable (ex. 3, nécessitant donc l'instruction ShellExecute), avec ou sans espaces, avec ou sans paramètres...

Les routines de manipulation de chaînes semblent donc appropriées, mais je me demandais si l'un d'entre vous n'aurait pas un code fiable et/ou plus simple à me proposer (permettant par exemple de "décoder" une ligne de commandes complexe comme ci-dessus) avant que je ne me lance seul dans la programmation fastidieuse d'une fonction avec les routines de manipulation de chaînes ?

En tout cas saib merci de t'intéresser à mon problème.
Maxime
0
cs_saib Messages postés 38 Date d'inscription mercredi 12 mars 2003 Statut Membre Dernière intervention 15 mars 2010
29 août 2004 à 20:43
une solution moyennement propre pourait etre de faire une ShellExecute dans tous les cas, comme ca plus besoin de detecter si le fichier est un executable ou pas, et quels que soient les parametres ca fonctionnerait (si ca marche comme le ShellExecute de Delphi) ???

saib
0
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 août 2004 à 00:43
C'est sans doute un peu simpliste, mais bon...

J'ai placé un ComboBox et un Button sur une fiche, avec ces lignes dans le ComboBox :

C:\Windows\Notepad.exe
install\setup.exe /autorun
doc\install\lisezmoi.txt
"Mon Fichier avec espaces.bat"
C:\Program Files\Winzip.exe.bak

avec ce code :

procedure TForm1.Button1Click(Sender: TObject);
const
  tExe: array[1..2] of String = ('.exe','.bat');
var
  i: Integer;
begin
  for i := 1 to 2 do
  begin
    if (Pos(tExe[i], ComboBox1.Text) <> 0)
    and (ComboBox1.Text[Pos(tExe[i], ComboBox1.Text) + 4] <> '.') then
    begin
      ShowMessage('Exécutable !');
      Exit;
    end;
  end;
  ShowMessage('Non exécutable !');
end;


Ca fonctionne plutôt pas mal, mais est-ce suffisamment fiable ?

Bon courage ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
japee Messages postés 1727 Date d'inscription vendredi 27 décembre 2002 Statut Modérateur Dernière intervention 6 novembre 2021 8
30 août 2004 à 00:57
Et puis pour extraire les paramètres, va bien falloir utiliser les routines de manipulation des chaînes... pffff...

Ma réponse était un peu légère :approve)
0
maxabbey Messages postés 11 Date d'inscription samedi 22 février 2003 Statut Membre Dernière intervention 28 août 2003 1
30 août 2004 à 09:33
Salut,

saib, j'avais bien pensé à ça, mettre ShellExecute tout le temps, mais il est vrai que c'est la solution de facilité par excellence :-)

Surtout que si le Open existe (toujours), il doit bien y avoir une raison, puisque ShellExecute le dépasse en tous points... il y a certainement une histoire de compatibilité entre les versions de Windows, peut-être que les premières versions 32 bits (95, NT 4) ne supportaient que l'instruction Open dans les AutoRun ? Faudrait que je me renseigne sur le site MSDN de Microsoft...

japee, j'aime bien ton petit exemple, surtout que ta méthode de détection d'extension est beaucoup plus simple que celle à laquelle j'avais pensé, mais comme tu dis, sa fiabilité demande à être mise à l'épreuve. Quel résultat nous donnerait-elle, par exemple, avec une commande complexe comme celle-ci, comportant espaces, extensions multiples et paramètres (juste pour faire c... son monde :big) )

"C:\Program Files\Windows NT\Accessoires\wordpad.exe" "C:\Documents and Settings\Maxime\Mes Documents\Fausse Doc sur les Fichiers .exe et autres exécutables.txt"

Ton programme nous afficherait-il que le fichier est un exécutable (ce qui serait la "bonne réponse" vu que le fichier à exécuter est ici Wordpad.exe) ou nous dirait-il qu'il ne l'est pas vu que la ligne de commandes comporte aussi .txt en dernière position (ce qui pourrait l'amener à considérer que c'est l'extension) ? Je crois surtout qu'il considérerait le deuxième .exe de la chaîne comme étant l'extension ce qui n'est pas du tout le cas ; mais il renverrait malgré tout "Exécutable" ce qui n'est pas faux :big)

D'après ce que j'ai compris, après avoir trouvé une extension .exe ou .bat (il faudrait aussi tester la présence d'extension .com et .pif), il teste les quatre prochains caractères pour voir s'il s'agit d'une "deuxième" extension (comme ton dernier exemple avec .exe.bak), mais cela ne fonctionnerait peut-être pas avec mon exemple et son .txt très éloigné du .exe :-)

Toutefois ton exemple est très intéressant, car il m'a permis d'imaginer un algorithme : il faudrait, je pense, rechercher dans la chaîne une extension .exe, .com, .pif ou .bat jusqu'au premier espace (considéré par Windows comme séparateur de paramètres), puis, faire la comparaison sur la dernière extension trouvée. Ce qui va être coton, c'est de devoir tenir compte des guillemets, s'il y en a, pour ne pas s'arrêter au premier espace... je sens que je vais m'amuser moi :-)

Remarque pour les plus sceptiques : ma ligne de commande fonctionne parfaitement sur mon PC via la commande Démarrer -> Exécuter, donc elle est parfaitement valide :-)

En tout cas merci les gars pour vos idées, je vais essayer de m'y mettre :-s

Amicalement,
Maxime
0
Rejoignez-nous