EXE SE SUPPRIME (WIN32)

Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007 - 2 mai 2004 à 15:31
cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007 - 4 mai 2004 à 17:55
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/22472-exe-se-supprime-win32

cs_Thaeron Messages postés 202 Date d'inscription vendredi 6 juillet 2001 Statut Membre Dernière intervention 31 octobre 2007
4 mai 2004 à 17:55
" convertir en nom court est une bonne methode pour la compatibilite vieillerie.
Mais bon faut aussi arreter un jour de regarder en arriere." exact BruNews faudrai arreter les api win32 et passer sous GNU/Linux , les vieilleries c'est fini.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
4 mai 2004 à 01:00
Pour ceux qui ont envie d'apprendre quelque chose (rudimentaire, mais c'est déjà non nul) avec cette source dont l'idée est cependant interessante :

#include <windows.h>
#include <stdio.h>

void SupprimeMoi()
{
FILE* FileBat;
char NomProgCourant[MAX_PATH];
char NomCourtProgCourant[MAX_PATH];

// Nom du fichier .bat temporaire.
char NomFichierBat[] = "temp.bat";

// On récupere le nom du prog courant
GetModuleFileName(NULL,NomProgCourant,sizeof(NomProgCourant));

// On le convertit en nom 'court'
GetShortPathName(NomProgCourant,NomCourtProgCourant,sizeof(NomCourtProgCourant));

// On essaie d'ecrire dans le fichier .bat.
if (FileBat = fopen(NomFichierBat, "wb"))
{
fprintf(FileBat, "echo off\r\ndel %s\r\ndel %s\r\n", NomCourtProgCourant, NomFichierBat);
fclose(FileBat);
}

// On exécute ce .bat.
ShellExecute(NULL, "open", NomFichierBat, NULL, NULL, SW_HIDE);

// On termine le programme principal.
exit(-1);
}

int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
SupprimeMoi();
return 0;
}


rassure toi brunews, le fichier exe produit (avec les bonnes options de linkage) n'est que de 3584 octets chez moi, c-a-d la meme taille qu'avec ton code. ouf !!!

pour ceux que ca interesse, pour réduire la taille de vos exe sous vc++ 6.0, ds les options de linkage (project, settings, link) :
enlever toutes les librairies de object/library modules
mettre MSVCRT.lib
essayer de compiler, et si lors de l'édition de lien, il y a des fonctions non résolues, rajouter uniquement la librairie de ces fonctions la. (suffit de chercher sur le net pour connaitre la libraire d'une fonction..)
exemple ici : les librairies utilisées sont MSVCRT.lib shell32.lib
(shell32 pour la fonction shellexecute)
enfin ds project options, rajouter /align:4096

Ha, et tout ca doit etre fait pour la version release (qui ne contient pas d'infos de debogage et qui est donc techniquement plus petite que la version debug)
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
3 mai 2004 à 21:26
je ne pense pas ca. par contre il existe un monde entre les couches d'abstraction dont tu as parlé, et cette source... tout n'est pas binaire, et je pense pas qu'il soit tres malin de produire ce code la pour faire ca...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mai 2004 à 20:45
Si tu penses que imbuvable = code alors...
Au lieu de mettre des 'string' et autres couches d'abstraction, y a VB qui deja tout cela, au moins c'est naturellement lent et c'est coherent.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
3 mai 2004 à 20:29
D'ou une source imbuvable pour gagner 2 kilo octets, mais bon vu k'les disques durs ont les tailles d'un disquette, c'est vrai ke c'est utile.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 23:45
Avec noms courts dans le bat:

void SupprimeMoi()
{
HANDLE hfl;
DWORD len, d, v;
char buff[268], szexe[272], szbat[272];
len = GetTempPath(264, buff);
if(buff[len-1] != '\\') buff[len++] = '\\';
buff[len] = 't'; buff[len+1] = '.'; buff[len+2] = 'b';
buff[len+3] = 'a'; buff[len+4] = 't'; buff[len+5] = 0;
hfl = CreateFile(buff, GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
if(hfl == INVALID_HANDLE_VALUE) return;
*((DWORD*) szbat) = 0x206C6564; // "del "
len = GetShortPathName(buff, szbat+4, 264) + 4;
*((DWORD*) szexe) = 0x6F686365; // "echo"
*((DWORD*) (szexe+4)) = 0x66666F20; // " off"
*((WORD*) (szexe+8)) = 0x0A0D;
WriteFile(hfl, szexe, 10, &v, 0);
GetModuleFileName(0, buff, 264);
*((DWORD*) szexe) = 0x206C6564; // "del "
d = GetShortPathName(buff, szexe+4, 264) + 4;
szexe[d] = 13; szexe[d+1] = 10;
WriteFile(hfl, szexe, d+2, &v, 0);
WriteFile(hfl, szbat, len, &v, 0);
CloseHandle(hfl);
*((DWORD*) szexe) = 0x6E65706F; // "open"
szexe[4] = 0; szbat[len+4] = 0;
ShellExecute(0, szexe, szbat+4, 0, 0, SW_HIDE);
}
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 mai 2004 à 21:56
ben je suis sous XP pro, dc jpense pas ke ca soit une vieillerie
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 19:56
convertir en nom court est une bonne methode pour la compatibilite vieillerie.
Mais bon faut aussi arreter un jour de regarder en arriere.
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
2 mai 2004 à 19:48
Sa depend de l'os sa si je me trompe pas y'a ka partir de win 2000 et sup ke la commande del suporte les ".
D'ailleur BruNews en convertisant le repertoire+nom en version cour
sera pas mieu ? au moin sur que sa fonctionne partout.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 mai 2004 à 19:35
ben j'ai essayé d'enlever de lancer un .bat avec un del et un nom entre "" et ca a rien supprimer, alors ke le meme mais ou le nom est converti en court ca a marché. apré cé vré ke cé bizare ke ca marche sur certains ordis et pas d'autres
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 19:31
Je viens de poser exe dans
"D:\Salut Lafoule youpi" et va encore.
Le nom du exe est entre guillemets dans le bat donc nom long ne doit pas gener normalement.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 mai 2004 à 19:19
ben ché moi, fo le convertir avec GetShortPathName() le nom du fichier. jai essayé et la ca marche
toi ptet tu l'as lancé depuis un dossier court...
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 19:01
Ah oui ?
J'avais fait sur un 2003 Server et la je viens de tester sur un XP, va bon idem.
cosmobob Messages postés 700 Date d'inscription mardi 30 décembre 2003 Statut Membre Dernière intervention 27 janvier 2009 4
2 mai 2004 à 18:50
il marche pas chez moi ce programme. fin il se suprime pas du tout koi
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
2 mai 2004 à 17:45
Bien merci BruNews. Euh par contre mon .exe il a pas perdu 1 octé.
Y'a que le .pdb et .map qui ont diminué de taille.
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
2 mai 2004 à 16:26
ok merci
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 16:16
demande le listing asm avec code original C en plus pour reperer aisement.
Sur VS, options, onglet C/C++, Fichiers de sortie.
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
2 mai 2004 à 16:06
comment on fait pour connaitre le code asm generé par le compilo pour une fonction ou un bout de code?
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
2 mai 2004 à 15:42
remets ton code dans la fonction SupprimeMoi() a la place du mien et compare la taille des exe, tu verras toi meme.
Tu peux aussi sortir le listing asm du compilo pour comparer, tu verras, y a pas photo.
Xilofeon Messages postés 55 Date d'inscription mercredi 24 décembre 2003 Statut Membre Dernière intervention 14 avril 2007
2 mai 2004 à 15:31
Euh veut rien dire je suis pas trés bon mais il fait koi de plus que ce ke j'ai mi dans le forum .
Pi mon code je l'utilise dans une appli win32.

C'est parceque j'utilise des string ?

Enfin si ce code et mieu je voudrai bien savoir pk

PS: je suis newbe
Rejoignez-nous