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 !

[WIN32][C][DEV-C++] AUTO LIST EN HTML


Information sur la source

Catégorie :Multimédia Classé sous : AVI, WMV, MOV, ASF, NSV Niveau : Initié Date de création : 25/07/2008 Date de mise à jour : 25/07/2008 21:28:35 Vu / téléchargé: 1 579 / 51

Note :
Aucune note

Commentaire sur cette source (3)
Ajouter un commentaire et/ou une note


Description

Bonjours a tous et toutes ^^


une petite source qui permet la génération automatique d'une liste de fichier sous forme de tableau en fichier html:

- liste des fichiers, puis répertoire avec leur taille + la durée (suivant les formats de fichiers)
- les formats de fichiers pour lesquelles la durée est affiché sont : AVI, DIVX, MP4, ASF, WMV, MOV, NSV

La source est un peu codé barbare je la mettrais à jour avec le temps :)

le binaire est présent;
renommer le fichier "AutoListHtml.exe_" par "AutoListHtml.exe"

j'attend vos remarques :p
 

Source

  • //------------------------------------------------------------------------------
  • // Projet AutoListHtml : génération de liste automatique
  • // Auteur : Hanteville Nicolas
  • // Fichier : main.c
  • // Version : 0.1
  • // Date de modification : 25/07/2008
  • // Site : http:\\omni.a.free.fr
  • //------------------------------------------------------------------------------
  • // gestion des includes
  • //------------------------------------------------------------------------------
  • #include "ressources.h"
  • //------------------------------------------------------------------------------
  • //emplacement de l'application en cours
  • void GetMyDirectory(char *path, unsigned int TAILLE)
  • {
  • char *c = path+GetModuleFileName(0, path,TAILLE);
  • while(*c != '\\') c--;
  • c++;
  • *c = 0;
  • }
  • //------------------------------------------------------------------------------
  • //convertion de nombre hexa sur 8 caractères en decimal
  • unsigned long HexaToDec(char *hexa,unsigned int taille)
  • {
  • unsigned long k=0;//resultat
  • unsigned long j=1,i; // j =coef multiplicateur et i variable de boucle
  • //traitement de la valeur hexa
  • for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal
  • {
  • switch(hexa[i])
  • {
  • case '1':k=k+j;break;
  • case '2':k=k+(2*j);break;
  • case '3':k=k+(3*j);break;
  • case '4':k=k+(4*j);break;
  • case '5':k=k+(5*j);break;
  • case '6':k=k+(6*j);break;
  • case '7':k=k+(7*j);break;
  • case '8':k=k+(8*j);break;
  • case '9':k=k+(9*j);break;
  • case 'a':k=k+(10*j);break;
  • case 'A':k=k+(10*j);break;
  • case 'b':k=k+(11*j);break;
  • case 'B':k=k+(11*j);break;
  • case 'c':k=k+(12*j);break;
  • case 'C':k=k+(12*j);break;
  • case 'd':k=k+(13*j);break;
  • case 'D':k=k+(13*j);break;
  • case 'e':k=k+(14*j);break;
  • case 'E':k=k+(14*j);break;
  • case 'f':k=k+(15*j);break;
  • case 'F':k=k+(15*j);break;
  • };
  • j=j*16;
  • };
  • return k;
  • };
  • //------------------------------------------------------------------------------
  • //lecture de la durée du fichier suivant le type
  • void LireDuree(char*fic,char*duree)
  • {
  • //http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx
  • unsigned short taille = strlen(fic);
  • unsigned long int time=0, frame=0;
  • unsigned long int final_time;
  • DWORD lue;
  • duree[0]=0;
  • //OK: AVI, DIVX, MP4, ASF, WMV, MOV, NSV
  • //identiques : AVI/MP4/DIVX
  • // a faire : MP3/MPG/MPEG/MKV/OGG/RM/RMVB/FLV
  • //MPG, FLV
  • //MKV header Format
  • //NSV
  • if(fic[taille-3]=='.' && (fic[taille-2]=='n' || fic[taille-2]=='N') && (fic[taille-1]=='s' || fic[taille-1]=='S'))
  • {
  • //on recherche en 1er le logo NSVf ou NSVs pour spéficier si streaming ou encodé
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on lit les 512er octets
  • char my_buffer[513];
  • SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets
  • ReadFile(Hfic,my_buffer,512,&lue,0);
  • //on test si un cmov (vidéo compressé)
  • int i;
  • BOOL ok = 1,stream=0;
  • for (i=0;i<512 && ok;i++)
  • {
  • if (my_buffer[i] == 'N' && my_buffer[i+1] == 'S' && my_buffer[i+2] == 'V')
  • {
  • ok=0;
  • if (my_buffer[i+3] == 's')stream=1;
  • i--;
  • }
  • }
  • if(ok)
  • {
  • //une video direct
  • if(!stream)
  • {
  • char tmp[9];
  • sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+12]&255,my_buffer[i+13]&255,my_buffer[i+14]&255,my_buffer[i+15]&255);
  • time = HexaToDec(tmp,8);
  • if(time)
  • {
  • time = time/1000;
  • if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
  • }
  • }//sinon streaming enregistré non traité
  • }
  • }
  • CloseHandle(Hfic);
  • }else if(fic[taille-4]=='.')
  • {
  • if(fic[taille-3]=='a' || fic[taille-3]=='A')
  • {
  • //AVI
  • if(fic[taille-1]=='i' || fic[taille-1]=='I')
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on passe les 32 1er octets
  • SetFilePointer(Hfic,32,0,FILE_BEGIN);
  • //temps entre les images
  • ReadFile(Hfic,&time,4,&lue,0);
  • //on passe les 12 octets suivants
  • SetFilePointer(Hfic,12,0,FILE_CURRENT);
  • //nombres d'images
  • ReadFile(Hfic,&frame,4,&lue,0);
  • if(time && frame)
  • {
  • //temps total en secondes (avant = microsecondes)
  • final_time = (time*frame)/1000000;
  • if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }
  • }
  • CloseHandle(Hfic);
  • //ASF
  • }else if(fic[taille-1]=='f' || fic[taille-1]=='F')
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on passe les 24 1er octes
  • SetFilePointer(Hfic,24,0,FILE_BEGIN);
  • //on lit le nombre d'objets (entêtes) (4 octets)
  • //ReadFile(Hfic,&frame,4,&lue,0);
  • //on passe le nombre d'entête suivantes (256bits/)
  • //on passe les 64 1er octets
  • SetFilePointer(Hfic,/*(frame*32)+*/64+2+4,0,FILE_CURRENT);
  • unsigned __int64 mytime;
  • //durée
  • ReadFile(Hfic,&mytime,8,&lue,0);
  • if(mytime)
  • {
  • final_time = mytime/10000000;
  • sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }
  • }
  • CloseHandle(Hfic);
  • }
  • }else if(fic[taille-3]=='m' || fic[taille-3]=='M')
  • {
  • //MP4
  • if(fic[taille-1]=='4')
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on passe les 32 1er octets
  • SetFilePointer(Hfic,32,0,FILE_BEGIN);
  • //temps entre les images
  • ReadFile(Hfic,&time,4,&lue,0);
  • //on passe les 12 octets suivants
  • SetFilePointer(Hfic,12,0,FILE_CURRENT);
  • //nombres d'images
  • ReadFile(Hfic,&frame,4,&lue,0);
  • if(time && frame)
  • {
  • //temps total en secondes (avant = microsecondes)
  • final_time = (time*frame)/1000000;
  • if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }
  • }
  • CloseHandle(Hfic);
  • //MOV
  • }else if(fic[taille-2]=='o' || fic[taille-2]=='O')
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on lit les 256er octets
  • char my_buffer[257];
  • SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets
  • ReadFile(Hfic,my_buffer,256,&lue,0);
  • //on test si un cmov (vidéo compressé)
  • int i;
  • BOOL ok = 1;
  • for (i=0;i<252 && ok;i++)
  • {
  • if (my_buffer[i] == 'c' && my_buffer[i+1] == 'm' && my_buffer[i+2] == 'o' && my_buffer[i+3] == 'v')
  • {
  • ok=0;
  • }
  • }
  • if(ok) //une video non compressé
  • {
  • //on cherche mvhd = header video
  • //on récupère sa position
  • for (i=0;i<252 && ok;i++)
  • {
  • if (my_buffer[i] == 'm' && my_buffer[i+1] == 'v' && my_buffer[i+2] == 'h' && my_buffer[i+3] == 'd')
  • {
  • ok=0;
  • i--;
  • }
  • }
  • char tmp[9];
  • sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+16]&255,my_buffer[i+17]&255,my_buffer[i+18]&255,my_buffer[i+19]&255);
  • frame = HexaToDec(tmp,8);
  • sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+20]&255,my_buffer[i+21]&255,my_buffer[i+22]&255,my_buffer[i+23]&255);
  • time = HexaToDec(tmp,8);
  • if(frame && time)
  • {
  • time = time/frame;
  • if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
  • }
  • }
  • }
  • CloseHandle(Hfic);
  • }
  • }else if(fic[taille-3]=='w' || fic[taille-3]=='W')
  • {
  • //WMA et WMV = ASF + media compressé
  • if(fic[taille-2]=='m' || fic[taille-2]=='M')
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on passe les 102 1er octes
  • SetFilePointer(Hfic,102,0,FILE_BEGIN);
  • unsigned __int64 mytime;
  • //durée
  • ReadFile(Hfic,&mytime,8,&lue,0);
  • final_time = mytime/10000000;
  • if (final_time > 36000 || final_time<1)
  • {
  • SetFilePointer(Hfic,442,0,FILE_BEGIN);
  • ReadFile(Hfic,&mytime,8,&lue,0);
  • final_time = mytime/10000000;
  • if (final_time > 36000 || final_time<1)
  • {
  • SetFilePointer(Hfic,444,0,FILE_BEGIN);
  • ReadFile(Hfic,&mytime,8,&lue,0);
  • final_time = mytime/10000000;
  • if (final_time > 36000 || final_time<1)
  • {
  • SetFilePointer(Hfic,14,0,FILE_BEGIN);
  • ReadFile(Hfic,&mytime,8,&lue,0);
  • final_time = mytime/10000000;
  • if (final_time < 36000 && final_time>0)
  • sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
  • }
  • CloseHandle(Hfic);
  • }
  • }
  • }else if (fic[taille-5]=='.')
  • {
  • //DIVX
  • if ((fic[taille-4]=='d' || fic[taille-4]=='D') && (fic[taille-1]=='x' || fic[taille-1]=='X'))
  • {
  • HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hfic != INVALID_HANDLE_VALUE)
  • {
  • //on passe les 32 1er octets
  • SetFilePointer(Hfic,32,0,FILE_BEGIN);
  • //temps entre les images
  • ReadFile(Hfic,&time,4,&lue,0);
  • //on passe les 12 octets suivants
  • SetFilePointer(Hfic,12,0,FILE_CURRENT);
  • //nombres d'images
  • ReadFile(Hfic,&frame,4,&lue,0);
  • if (time&&frame)
  • {
  • //temps total en secondes (avant = microsecondes)
  • time = time*frame/1000000;
  • if (final_time>0)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
  • }
  • }
  • CloseHandle(Hfic);
  • }
  • }
  • }
  • //------------------------------------------------------------------------------
  • //liste des répertoires dans le répertoire principal
  • BOOL ListItems(const char *fic,char *concat,HANDLE Hdest)
  • {
  • WIN32_FIND_DATA data;
  • char Rep [MAX_PATH];
  • char Concat[MAX_PATH];
  • __int64 taille_fic;
  • char duree[256];
  • char tmp[MAX_PATH]; DWORD copiee;
  • BOOL ret=0;
  • // les fichiers
  • HANDLE hfic = FindFirstFile(fic, &data);
  • if (hfic != INVALID_HANDLE_VALUE)
  • {
  • do
  • {
  • if(data.cFileName[0] != '.')
  • {
  • strcpy(Rep,fic);
  • Rep[strlen(fic)-3]=0;
  • strncat(Rep,data.cFileName,MAX_PATH);
  • if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire
  • {
  • }else if (!(!strcmp(data.cFileName,"Thumbs.db")))//sinon un fichier (sauf si un thumb)
  • {
  • ret=1;
  • strncat(Rep,"\0",MAX_PATH);
  • //taille du fichier
  • taille_fic = (data.nFileSizeHigh * MAXDWORD) + data.nFileSizeLow;
  • //durée du fichier
  • LireDuree(Rep,duree);
  • //affichage
  • if (taille_fic>1048576) //supérieur a 1 mo
  • sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fmo</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1048576.0,duree);
  • else if (taille_fic>1024) //supérieur a 1 ko
  • sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fko</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1024.0,duree);
  • else
  • sprintf(tmp," <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%do</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic,duree);
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • }
  • }
  • }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
  • }
  • FindClose(hfic);
  • //les répertoires
  • hfic = FindFirstFile(fic, &data);
  • if (hfic != INVALID_HANDLE_VALUE)
  • {
  • do
  • {
  • if(data.cFileName[0] != '.')
  • {
  • strcpy(Rep,fic);
  • Rep[strlen(fic)-3]=0;
  • strncat(Rep,data.cFileName,MAX_PATH);
  • if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire
  • {
  • //traitement redondance
  • strncat(Rep,"\\*.*\0",MAX_PATH);
  • if (concat[0]!=0)
  • sprintf(Concat,"%s\\%s",concat,data.cFileName);
  • else
  • strcpy(Concat,data.cFileName);
  • if(ListItems(Rep,Concat,Hdest))
  • {
  • strcpy(tmp," <tr bgcolor=\"#DDDDDD\"><td colspan=\"4\"></td></tr>");
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • }
  • }
  • }
  • }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
  • }
  • FindClose(hfic);
  • return ret;
  • }
  • //------------------------------------------------------------------------------
  • //liste des items présents dans un répertoire
  • void ListRep(const char *fic,HANDLE Hdest)
  • {
  • WIN32_FIND_DATA data;
  • HANDLE hfic = FindFirstFile(fic, &data);
  • char Rep [MAX_PATH];
  • char Concat[2]="";
  • __int64 taille_fic;
  • char duree[10];
  • char tmp[MAX_PATH]; DWORD copiee;
  • if (hfic != INVALID_HANDLE_VALUE)
  • {
  • do
  • {
  • if(data.cFileName[0] != '.')
  • {
  • strcpy(Rep,fic);
  • Rep[strlen(fic)-3]=0;
  • strncat(Rep,data.cFileName,MAX_PATH);
  • if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(!strcmp("System Volume Information",data.cFileName)) && !(!strcmp("RECYCLER",data.cFileName)))//si un répertoire
  • {
  • strncat(Rep,"\\*.*\0",MAX_PATH);
  • //impression du titre et début tableau
  • sprintf(tmp," <H2>%s</H2>\r\n"
  • " <table border=\"0\" cellspacing=\"2\" cellpadding=\"1\">\r\n"
  • " <tr><td BGCOLOR=#DDDDDD><b>Genre/serie</b></td><td BGCOLOR=#DDDDDD><b>Fichier</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Taille</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Durée</b></td></tr>\r\n"
  • ,data.cFileName);
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • ListItems(Rep,Concat,Hdest);
  • //fin du tableau
  • sprintf(tmp," </table>\r\n <BR/>\r\n");
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • }
  • }
  • }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
  • }
  • FindClose(hfic);
  • }
  • //------------------------------------------------------------------------------
  • //génération de la liste
  • DWORD WINAPI GenList(LPVOID lParam)
  • {
  • char rep[MAX_PATH];
  • char repInit[MAX_PATH];
  • char tmp[MAX_PATH]; DWORD copiee;
  • unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
  • if(max)
  • {
  • EnableWindow(H_start,0);
  • //ouverture du fichier
  • HANDLE Hdest= CreateFile(LIST_DEF,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
  • if (Hdest != INVALID_HANDLE_VALUE)
  • {
  • //début du fichier
  • sprintf(tmp,"<html>\r\n");
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • while (max--)
  • {
  • SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)repInit);
  • sprintf(tmp," <center><H1>%s</H1></center>\r\n",repInit);
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • strncpy(rep,repInit,MAX_PATH);
  • strncat(rep,"*.*\0",MAX_PATH);
  • ListRep(rep,Hdest);
  • //suppression du 1er item
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0);
  • }
  • //fin du fichier
  • sprintf(tmp,"</html>\r\n");
  • WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
  • }
  • //fermeture du fichier
  • CloseHandle(Hdest);
  • //ouverture du fichier résultat
  • GetMyDirectory(tmp,MAX_PATH);
  • strncat(tmp,LIST_DEF,MAX_PATH);
  • strncat(tmp,"\0",MAX_PATH);
  • ShellExecute(NULL,"Open",tmp, NULL, NULL, SW_SHOWNORMAL);
  • EnableWindow(H_start,0);
  • }
  • }
  • //------------------------------------------------------------------------------
  • //gestion des appels et msg sur le fenêtre principale
  • HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam)
  • {
  • HDROP H_DropInfo;
  • int nb,i;
  • switch(Msg)
  • {
  • case WM_INITDIALOG:
  • InitCommonControls();
  • //récupération des handl généraux
  • H_LST = GetDlgItem(hwnd,LST);
  • H_start = GetDlgItem(hwnd,BT_START);
  • //application d'une icone
  • SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
  • break;
  • case WM_CLOSE:
  • EndDialog(hwnd,0);
  • //PostQuitMessage(0);
  • break;
  • case WM_COMMAND :
  • if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • unsigned int nb = SendMessage(H_LST,LB_GETSELCOUNT,(WPARAM)0,(LPARAM)0);
  • if (nb>1)
  • {
  • //récupération des IDs des Items sélectionnés
  • int Items[MAX_PATH];
  • if (SendMessage(H_LST,LB_GETSELITEMS,(WPARAM)MAX_PATH,(LPARAM)Items)!= LB_ERR)
  • {
  • for (i=nb-1;i>-1;i--)
  • {
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)(const)Items[i],(LPARAM)0);
  • }
  • }
  • }else
  • {
  • //suppression de la sélection
  • int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
  • if (nb>-1)
  • {
  • SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
  • if (nb-1 <0)SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)0);
  • else SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)nb-1);
  • }
  • }
  • }else if ((LOWORD(Wparam) == BT_START) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • CreateThread(NULL, 0,GenList,0,0,0);
  • }else if ((LOWORD(Wparam) == BT_A_PROPOS) && (HIWORD(Wparam) == BN_CLICKED))
  • {
  • MessageBox(0,"AutoListHtml_V0.1 du 25/07/2008\n"
  • "Par : Hanteville Nicolas\n"
  • "Libre de droit et d'utilisations.\n"
  • "Pour toute question : nico248@free.fr\n"
  • "Site Web : http:\\\\omni.a.free.fr"
  • ,"A propos",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);
  • }
  • break;
  • case WM_DROPFILES:
  • {
  • char tmp[MAX_PATH];
  • //récupération de la liste des fichiers sélectionnés + traitemen
  • H_DropInfo=(HDROP)Wparam;//récupération de la liste
  • //traitement : nb de fichier en drag
  • nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 );
  • for (i=0;i<nb;i++)
  • {
  • DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération
  • SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp);
  • }
  • DragFinish(H_DropInfo);//libération de la mémoire
  • }
  • break;
  • }
  • return 0;
  • }
  • //------------------------------------------------------------------------------
  • //fonction principal (main)
  • int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow)
  • {
  • Hinst = hInst;
  • //création de la fenêtre
  • DialogBox(0,MAKEINTRESOURCE(AutoListHtml),GetDesktopWindow(),(DLGPROC)DlgProc);
  • return 0;
  • }
//------------------------------------------------------------------------------
// Projet AutoListHtml  : génération de liste automatique
// Auteur               : Hanteville Nicolas
// Fichier              : main.c
// Version              : 0.1
// Date de modification : 25/07/2008
// Site                 : http:\\omni.a.free.fr
//------------------------------------------------------------------------------
// gestion des includes
//------------------------------------------------------------------------------
#include "ressources.h"
//------------------------------------------------------------------------------
//emplacement de l'application en cours
void GetMyDirectory(char *path, unsigned int TAILLE)
{
  char *c = path+GetModuleFileName(0, path,TAILLE);
  while(*c != '\\') c--;
  c++;
  *c = 0;
}
//------------------------------------------------------------------------------
//convertion de nombre hexa sur 8 caractères en decimal
unsigned long HexaToDec(char *hexa,unsigned int taille)
{
 unsigned long  k=0;//resultat   
 unsigned long  j=1,i; // j =coef multiplicateur et i variable de boucle       
    //traitement de la valeur hexa   
    
    for (i=(taille-1);i>0;i--)//calcul de la valeur hexa en decimal
    {
        switch(hexa[i])
        {
         case '1':k=k+j;break;
         case '2':k=k+(2*j);break;
         case '3':k=k+(3*j);break;
         case '4':k=k+(4*j);break;
         case '5':k=k+(5*j);break;
         case '6':k=k+(6*j);break;
         case '7':k=k+(7*j);break;
         case '8':k=k+(8*j);break;
         case '9':k=k+(9*j);break;
         case 'a':k=k+(10*j);break;
         case 'A':k=k+(10*j);break;
         case 'b':k=k+(11*j);break;
         case 'B':k=k+(11*j);break;
         case 'c':k=k+(12*j);break;
         case 'C':k=k+(12*j);break;
         case 'd':k=k+(13*j);break;
         case 'D':k=k+(13*j);break;
         case 'e':k=k+(14*j);break;
         case 'E':k=k+(14*j);break;
         case 'f':k=k+(15*j);break;
         case 'F':k=k+(15*j);break;
        }; 
        j=j*16;  
    };
  return k;       
};
//------------------------------------------------------------------------------
//lecture de la durée du fichier suivant le type
void LireDuree(char*fic,char*duree)
{
     //http://www.codeproject.com/KB/audio-video/mpegaudioinfo.aspx
  unsigned short taille = strlen(fic);
  unsigned long int time=0, frame=0; 
  unsigned long int final_time;
  DWORD lue;
  duree[0]=0;

//OK: AVI, DIVX, MP4, ASF, WMV, MOV, NSV
//identiques : AVI/MP4/DIVX

// a faire : MP3/MPG/MPEG/MKV/OGG/RM/RMVB/FLV 

//MPG, FLV

//MKV header Format

  //NSV
  if(fic[taille-3]=='.' && (fic[taille-2]=='n' || fic[taille-2]=='N') && (fic[taille-1]=='s' || fic[taille-1]=='S'))
  {
      //on recherche en 1er le logo NSVf ou NSVs pour spéficier si streaming ou encodé           
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
             //on lit les 512er octets
             char my_buffer[513]; 
             SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets
             ReadFile(Hfic,my_buffer,512,&lue,0);

              //on test si  un cmov (vidéo compressé)
              int i;
              BOOL ok = 1,stream=0;
              for (i=0;i<512 && ok;i++)
              {
                if (my_buffer[i] == 'N' && my_buffer[i+1] == 'S' && my_buffer[i+2] == 'V')
                {
                  ok=0;
                  if (my_buffer[i+3] == 's')stream=1;
                  i--;
                }
              }
              
              if(ok) 
              {
                //une video direct
                if(!stream)
                {
                      char tmp[9];
                      sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+12]&255,my_buffer[i+13]&255,my_buffer[i+14]&255,my_buffer[i+15]&255);
                      time = HexaToDec(tmp,8);          
    
                      if(time)
                      {
                        time = time/1000;
                        if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
                      }
                }//sinon streaming enregistré non traité
             }
          }
          CloseHandle(Hfic);                        
  }else if(fic[taille-4]=='.')
  {
    if(fic[taille-3]=='a' || fic[taille-3]=='A')
    {
      //AVI
      if(fic[taille-1]=='i' || fic[taille-1]=='I')
      {
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
            //on passe les 32 1er octets
            SetFilePointer(Hfic,32,0,FILE_BEGIN);
            
            //temps entre les images
            ReadFile(Hfic,&time,4,&lue,0);
            
            //on passe les 12 octets suivants
            SetFilePointer(Hfic,12,0,FILE_CURRENT);   
            
            //nombres d'images
            ReadFile(Hfic,&frame,4,&lue,0);
            
            if(time && frame)
            {
                //temps total en secondes (avant = microsecondes)
                final_time = (time*frame)/1000000;
                if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
            }
          }
          CloseHandle(Hfic);
      //ASF
      }else if(fic[taille-1]=='f' || fic[taille-1]=='F')
      {
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
            //on passe les 24 1er octes
            SetFilePointer(Hfic,24,0,FILE_BEGIN);
            
            //on lit le nombre d'objets (entêtes) (4 octets)
            //ReadFile(Hfic,&frame,4,&lue,0);
            
            //on passe le nombre d'entête suivantes (256bits/)
            //on passe les 64 1er octets
            SetFilePointer(Hfic,/*(frame*32)+*/64+2+4,0,FILE_CURRENT);

            unsigned __int64 mytime;
            
            //durée
            ReadFile(Hfic,&mytime,8,&lue,0);

            if(mytime)
            {
                final_time = mytime/10000000;
                sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
            }
          }
          CloseHandle(Hfic);            
      }
    }else if(fic[taille-3]=='m' || fic[taille-3]=='M')
    {
        //MP4
        if(fic[taille-1]=='4')
        {
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
            //on passe les 32 1er octets
            SetFilePointer(Hfic,32,0,FILE_BEGIN);
            
            //temps entre les images
            ReadFile(Hfic,&time,4,&lue,0);
            
            //on passe les 12 octets suivants
            SetFilePointer(Hfic,12,0,FILE_CURRENT);   
            
            //nombres d'images
            ReadFile(Hfic,&frame,4,&lue,0);
            
            if(time && frame)
            {
                //temps total en secondes (avant = microsecondes)
                final_time = (time*frame)/1000000;
    
                if (final_time>0)sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
            }
          }
          CloseHandle(Hfic);      
      //MOV
      }else if(fic[taille-2]=='o' || fic[taille-2]=='O')
      {
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
             //on lit les 256er octets
             char my_buffer[257]; 
             SetFilePointer(Hfic,0,0,FILE_BEGIN);//on passe les 4er octets
             ReadFile(Hfic,my_buffer,256,&lue,0);

              //on test si  un cmov (vidéo compressé)
              int i;
              BOOL ok = 1;
              for (i=0;i<252 && ok;i++)
              {
                if (my_buffer[i] == 'c' && my_buffer[i+1] == 'm' && my_buffer[i+2] == 'o' && my_buffer[i+3] == 'v')
                {
                  ok=0;
                }
              }
              
              if(ok) //une video non compressé
              {
                  //on cherche  mvhd = header video
                  //on récupère sa position
                  for (i=0;i<252 && ok;i++)
                  {
                    if (my_buffer[i] == 'm' && my_buffer[i+1] == 'v' && my_buffer[i+2] == 'h' && my_buffer[i+3] == 'd')
                    {
                      ok=0;
                      i--;
                    }
                  }
                  char tmp[9];
                  sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+16]&255,my_buffer[i+17]&255,my_buffer[i+18]&255,my_buffer[i+19]&255);
                  frame = HexaToDec(tmp,8);
        
                  sprintf(tmp,"%02X%02X%02X%02X",my_buffer[i+20]&255,my_buffer[i+21]&255,my_buffer[i+22]&255,my_buffer[i+23]&255);
                  time = HexaToDec(tmp,8);          

                  if(frame && time)
                  {
                    time = time/frame;
                    if (time>1)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
                  }
              }
          }
          CloseHandle(Hfic);              
      }     
    }else if(fic[taille-3]=='w' || fic[taille-3]=='W')
    {   
      //WMA et WMV = ASF + media compressé
      if(fic[taille-2]=='m' || fic[taille-2]=='M')
      {            
          HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
          if (Hfic != INVALID_HANDLE_VALUE)
          {
            //on passe les 102 1er octes
            SetFilePointer(Hfic,102,0,FILE_BEGIN);
            unsigned __int64 mytime;
            //durée
            ReadFile(Hfic,&mytime,8,&lue,0);

            final_time = mytime/10000000;
            
            if (final_time > 36000 || final_time<1)
            {
              SetFilePointer(Hfic,442,0,FILE_BEGIN);
              ReadFile(Hfic,&mytime,8,&lue,0);
              final_time = mytime/10000000;
              
              if (final_time > 36000  || final_time<1)
              {
                  SetFilePointer(Hfic,444,0,FILE_BEGIN);
                  ReadFile(Hfic,&mytime,8,&lue,0);
                  final_time = mytime/10000000;
                  
                  if (final_time > 36000  || final_time<1)
                  {
                      SetFilePointer(Hfic,14,0,FILE_BEGIN);
                      ReadFile(Hfic,&mytime,8,&lue,0);
                      final_time = mytime/10000000;
                      
                      if (final_time < 36000 && final_time>0)
                        sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
                  }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
              }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
            }else sprintf(duree,"%02d:%02d:%02d",final_time/3600,(final_time%3600)/60,(final_time%3600)%60);
          }
          CloseHandle(Hfic);   
      }    
    }
  }else if (fic[taille-5]=='.')
  {
    //DIVX
    if ((fic[taille-4]=='d' || fic[taille-4]=='D') && (fic[taille-1]=='x' || fic[taille-1]=='X'))
    {
      HANDLE Hfic = CreateFile(fic,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
      if (Hfic != INVALID_HANDLE_VALUE)
      {
        //on passe les 32 1er octets
        SetFilePointer(Hfic,32,0,FILE_BEGIN);
        
        //temps entre les images
        ReadFile(Hfic,&time,4,&lue,0);
        
        //on passe les 12 octets suivants
        SetFilePointer(Hfic,12,0,FILE_CURRENT);   
        
        //nombres d'images
        ReadFile(Hfic,&frame,4,&lue,0);
        
        if (time&&frame)
        {
            //temps total en secondes (avant = microsecondes)
            time = time*frame/1000000;
            
            if (final_time>0)sprintf(duree,"%02d:%02d:%02d",time/3600,(time%3600)/60,(time%3600)%60);
        }
      }
      CloseHandle(Hfic);
    }
  }
}

//------------------------------------------------------------------------------
//liste des répertoires dans le répertoire principal
BOOL ListItems(const char *fic,char *concat,HANDLE Hdest)
{
   WIN32_FIND_DATA data;
   char Rep [MAX_PATH];
   char Concat[MAX_PATH];
   __int64 taille_fic;
   char duree[256];
   char tmp[MAX_PATH]; DWORD copiee;
   BOOL ret=0;
   
   // les fichiers
   HANDLE hfic = FindFirstFile(fic, &data);
   
   if (hfic != INVALID_HANDLE_VALUE)
   {
     do
     {
       if(data.cFileName[0] != '.')
       {
         strcpy(Rep,fic);
         Rep[strlen(fic)-3]=0;
         strncat(Rep,data.cFileName,MAX_PATH);
           
         if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire
         {                                                                                                                                                                                                                                   
         }else if (!(!strcmp(data.cFileName,"Thumbs.db")))//sinon un fichier (sauf si un thumb)
         {
           ret=1;
           strncat(Rep,"\0",MAX_PATH);
           
           //taille du fichier
           taille_fic = (data.nFileSizeHigh * MAXDWORD) + data.nFileSizeLow;   
           
           //durée du fichier  
           LireDuree(Rep,duree);   
           
           //affichage
           if (taille_fic>1048576) //supérieur a 1 mo       
              sprintf(tmp,"      <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fmo</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1048576.0,duree);       
           else if (taille_fic>1024) //supérieur a 1 ko       
              sprintf(tmp,"      <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%2.2fko</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic/1024.0,duree);    
           else   
              sprintf(tmp,"      <tr><td><b>%s</b></td><td><b>%s</b></td><td><b>%do</b></td><td><b>%s</b></td></tr>\r\n\0",concat,data.cFileName,taille_fic,duree);
           
           WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);               
         }
       }
     }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
   }
   FindClose(hfic);

   //les répertoires
   hfic = FindFirstFile(fic, &data);
   
   if (hfic != INVALID_HANDLE_VALUE)
   {
     do
     {
       if(data.cFileName[0] != '.')
       {
         strcpy(Rep,fic);
         Rep[strlen(fic)-3]=0;
         strncat(Rep,data.cFileName,MAX_PATH);
           
         if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//si un répertoire
         {                                                                                                                                                                                                                                   
           //traitement redondance
           strncat(Rep,"\\*.*\0",MAX_PATH);
           if (concat[0]!=0)
             sprintf(Concat,"%s\\%s",concat,data.cFileName);
           else 
             strcpy(Concat,data.cFileName);
  
           if(ListItems(Rep,Concat,Hdest))
           {
             strcpy(tmp,"      <tr bgcolor=\"#DDDDDD\"><td colspan=\"4\"></td></tr>");
             WriteFile(Hdest,tmp,strlen(tmp),&copiee,0);
           }

         }
       }
     }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
   }
   FindClose(hfic);
      
   return ret;
}
//------------------------------------------------------------------------------
//liste des items présents dans un répertoire
void ListRep(const char *fic,HANDLE Hdest)
{
   WIN32_FIND_DATA data;
   HANDLE hfic = FindFirstFile(fic, &data);
   char Rep [MAX_PATH];
   char Concat[2]="";
   __int64 taille_fic;
   char duree[10];
   char tmp[MAX_PATH]; DWORD copiee;
   
   if (hfic != INVALID_HANDLE_VALUE)
   {
     do
     {
       if(data.cFileName[0] != '.')
       {
         strcpy(Rep,fic);
         Rep[strlen(fic)-3]=0;
         strncat(Rep,data.cFileName,MAX_PATH);
           
         if (data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY && !(!strcmp("System Volume Information",data.cFileName)) && !(!strcmp("RECYCLER",data.cFileName)))//si un répertoire
         {                                                                                                                                                                                                                                   
           strncat(Rep,"\\*.*\0",MAX_PATH);
           
           //impression du titre et début tableau
           sprintf(tmp,"    <H2>%s</H2>\r\n"
                           "    <table border=\"0\" cellspacing=\"2\" cellpadding=\"1\">\r\n"
                           "      <tr><td BGCOLOR=#DDDDDD><b>Genre/serie</b></td><td BGCOLOR=#DDDDDD><b>Fichier</b></td><td width=\"120px\"  BGCOLOR=#DDDDDD><b>Taille</b></td><td width=\"120px\" BGCOLOR=#DDDDDD><b>Durée</b></td></tr>\r\n"
           ,data.cFileName);
           WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); 
             
           ListItems(Rep,Concat,Hdest);
           
           //fin du tableau
           sprintf(tmp,"    </table>\r\n    <BR/>\r\n");
           WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); 
         }
       }
     }while(FindNextFile (hfic,&data)); //récupération des fichiers 1 par 1
   }
   FindClose(hfic);
}

//------------------------------------------------------------------------------
//génération de la liste
DWORD WINAPI GenList(LPVOID lParam)
{
  char rep[MAX_PATH];
  char repInit[MAX_PATH];
  char tmp[MAX_PATH]; DWORD copiee;
  unsigned int max = SendMessage(H_LST,LB_GETCOUNT,(WPARAM)0,(LPARAM)0);
  
  if(max)
  {
      EnableWindow(H_start,0);
      //ouverture du fichier
      HANDLE Hdest= CreateFile(LIST_DEF,GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_FLAG_SEQUENTIAL_SCAN,0);
      if (Hdest != INVALID_HANDLE_VALUE)
      {
          //début du fichier
          sprintf(tmp,"<html>\r\n");
          WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); 
        
         while (max--)
         {
              SendMessage(H_LST,LB_GETTEXT,(WPARAM)0,(LPARAM)repInit);
              sprintf(tmp,"    <center><H1>%s</H1></center>\r\n",repInit);
              WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); 
              
              strncpy(rep,repInit,MAX_PATH);
              strncat(rep,"*.*\0",MAX_PATH);
              ListRep(rep,Hdest);
              
              //suppression du 1er item
              SendMessage(H_LST,LB_DELETESTRING,(WPARAM)0,(LPARAM)0); 
          }
          
          //fin du fichier
          sprintf(tmp,"</html>\r\n");
          WriteFile(Hdest,tmp,strlen(tmp),&copiee,0); 
      }
      //fermeture du fichier
      CloseHandle(Hdest); 
      
      //ouverture du fichier résultat
      GetMyDirectory(tmp,MAX_PATH);
      strncat(tmp,LIST_DEF,MAX_PATH);
      strncat(tmp,"\0",MAX_PATH);      
      
      ShellExecute(NULL,"Open",tmp, NULL, NULL, SW_SHOWNORMAL); 
      EnableWindow(H_start,0);
  } 
}
//------------------------------------------------------------------------------
//gestion des appels et msg sur le fenêtre principale
HRESULT DlgProc(HWND hwnd,UINT Msg,WPARAM Wparam,LPARAM lParam) 
{
 HDROP H_DropInfo;
 int nb,i;
  switch(Msg) 
  {
      case WM_INITDIALOG:
           InitCommonControls();
           
           //récupération des handl généraux
           H_LST           = GetDlgItem(hwnd,LST);
           H_start         = GetDlgItem(hwnd,BT_START);
          //application d'une icone
          SendMessage(hwnd, WM_SETICON, ICON_BIG, (LPARAM)LoadIcon(Hinst, MAKEINTRESOURCE(ID_ICON)));
      break;
      case WM_CLOSE:
          EndDialog(hwnd,0);
          //PostQuitMessage(0);
      break;
      case WM_COMMAND :
           
           if ((LOWORD(Wparam) == BT_SUP) && (HIWORD(Wparam) == BN_CLICKED))
           {
             unsigned int nb = SendMessage(H_LST,LB_GETSELCOUNT,(WPARAM)0,(LPARAM)0);
             if (nb>1) 
             {
               //récupération des IDs des Items sélectionnés
               int Items[MAX_PATH];
               if (SendMessage(H_LST,LB_GETSELITEMS,(WPARAM)MAX_PATH,(LPARAM)Items)!= LB_ERR)
               {
                 for (i=nb-1;i>-1;i--)
                 {
                   SendMessage(H_LST,LB_DELETESTRING,(WPARAM)(const)Items[i],(LPARAM)0);
                 }
               }
             }else
             {
                 //suppression de la sélection
                 int nb = SendMessage(H_LST,LB_GETCURSEL,(WPARAM)0,(LPARAM)0);
                 
                 if (nb>-1)
                 {
                   SendMessage(H_LST,LB_DELETESTRING,(WPARAM)nb,(LPARAM)0);
                   
                   if (nb-1 <0)SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)0);
                   else SendMessage(H_LST,LB_SETSEL ,(WPARAM)TRUE,(LPARAM)nb-1);
                 }
             }
           }else if ((LOWORD(Wparam) == BT_START) && (HIWORD(Wparam) == BN_CLICKED))
           {
             CreateThread(NULL, 0,GenList,0,0,0); 
           }else if ((LOWORD(Wparam) == BT_A_PROPOS) && (HIWORD(Wparam) == BN_CLICKED))
           {
              MessageBox(0,"AutoListHtml_V0.1 du 25/07/2008\n"
                           "Par : Hanteville Nicolas\n"
                           "Libre de droit et d'utilisations.\n"
                           "Pour toute question : nico248@free.fr\n"
                           "Site Web : http:\\\\omni.a.free.fr"
              ,"A propos",MB_OK|MB_TOPMOST|MB_ICONINFORMATION);    
           }
      break;
      case WM_DROPFILES:           
           {
               char tmp[MAX_PATH];
               
               //récupération de la liste des fichiers sélectionnés + traitemen
               H_DropInfo=(HDROP)Wparam;//récupération de la liste
               
               //traitement : nb de fichier en drag
               nb=DragQueryFile(H_DropInfo, 0xFFFFFFFF, NULL, 0 );
    
               for (i=0;i<nb;i++)
               {
                 DragQueryFile(H_DropInfo,i,tmp,DragQueryFile(H_DropInfo,i,0,0)+1 ); //récupération
                 SendMessage(H_LST,LB_ADDSTRING,(WPARAM)0,(LPARAM)tmp);
               }
               DragFinish(H_DropInfo);//libération de la mémoire
           }
      break;
   }     
   return 0;        
}
//------------------------------------------------------------------------------
//fonction  principal (main)
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hinstancePRECEDENTE, LPSTR CmdLine, int CmdShow) 
{  
  Hinst = hInst;
  
  //création de la fenêtre
  DialogBox(0,MAKEINTRESOURCE(AutoListHtml),GetDesktopWindow(),(DLGPROC)DlgProc); 
   
  return 0;
}

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

25 juillet 2008 21:28:35 :
- ajout zip

Commentaires et avis

signaler à un administrateur
Commentaire de JPR74 le 28/07/2008 10:58:47

Programme sans doute intéressant (surtout en Dev-CPP) mais, comme presque tous ceux qui sont présentés, assez difficile à lire car écrit sans la moindre rigueur (cadrages, tabulations fantaisistes, lignes trop longues, etc) !
Mais au moins, l'auteur a le courage de l'annoncer ("écrit un peu barbare"...) !
C'est pourtant si simple d'écrire proprement dés le début et les modifications sont ensuite beaucoup plus faciles.
C'est dommage car il y a souvent de bonnes idées dans les programmes proposés...
Si, comme je le redoute, cela continue, je finirai par proposer un article sur la façon d'écrire le C (et C++) pour obtenir des programmes faciles à lire et à modifier.
Quant à l'orthographe ... je préfère ne rien en dire !
Programmant depuis plus de 40 ans (assembleur, Cobol, Fortran, Basic, C et C++), je sais de quoi je parle et je vourais bien en faire profiter les autres !
L'expérience la plus redoutable (pour mes élèves) est de leur faire modifier un programme écrit par un autre car là, ils comprennent vite la nécessité de bien écrire (même pour soi même).
A suivre...

signaler à un administrateur
Commentaire de omnia le 28/07/2008 12:54:38

Bonjour,

merci pour le commentaire.

Pour information cette source est une ébauche et quand je dis "écrit un peu barbare" c'est surtout pour la fonction de calcul/lecture de la durée des fichiers multimédia.

On remarque notement que ce code est indenté (et je ne connais aucune norme qui fixe une taille d'indentation) commenté même si pas suffisement (mais je ne vais pas non plus commenté des if)

Pour ce qui est des articles, possible a toute personne de faire par à la communauté.

Pour ce qui est des élèves je donne aussi des cours de c et d'administration et je developpe en de multiples langage depuis plus de 10 ans maintenant si c'est du code objet qu'il vous faut faite du java du python ...

Je n'ai pas de mauvaise pensé envers ce commentaire mais je pense qu'il faut arrêter de ce f. du monde!

signaler à un administrateur
Commentaire de JPR74 le 28/07/2008 19:20:09

Bonjour,

   Je suis désolé si vous avez mal compris mon commentaire.
   Je n'ai pas l'impression de me moquer de qui que ce soit quand je dis qu'un programme peut aussi être agréable à parcourir et facile à modifier quand il est bien écrit, quel que soit le langage utilisé.
   C'est vrai qu'il n'y a aucune règle définie pour l'écriture d'un programme, ce qui conduit, hélas, aux abus que je déplore.
   L'utilisation d'un langage objet n'empêche pas d'écrire des horreurs...

   Restons en là pour l'instant mais il n'est pas exclu qu'une nouvelle colère me pousse à déposer un exemple de programme facile à lire sans avoir à manipuler sans arrêt l'ascenseur pour voir le bout des lignes.  

Ajouter un commentaire