Accueil > > > LISTEUR DE FICHIERS [WIN32 / VC6]
LISTEUR DE FICHIERS [WIN32 / VC6]
Information sur la source
Description
Bonjour, Voici un listeur de fichiers réalisé dans le cadre d'un *petit* concours de programmation. J'ai rajouté des petites fonctions basiques au listeur de fichier demandé. Mon programme liste séparément fichiers et dossiers. On peut naviguer sur tous les disques durs de l'ordinateur. Pour les fichiers, on peut l'ouvrir en lecture et voir quelques infos sur lui. Pour certaines extensions, la vue du fichier ne fonctionne pas, ce qui est compréhensible. Pour y remédier, j'ai codé une sorte de filtre d'extensions. Dans tous les cas, j'ai essayé d'utiliser des trucs courants en prog Win32 : - Le sous classement de l'Edit où l'on peut rentrer le chemin du dossier à lister. Il s'agit de filtrer les messages et de voir si on appuie sur la touche <Entrée>. On fais suivre les autres si ce n'est pas le cas. - Obtenir la liste des lecteurs d'un disque. - Mapper un fichier en mémoire - Réaction à un click sur une zone du Dialog. J'ai codé ça peut être un peu n'importe comment. Je voyais pas trop comment le faire sinon. - L'obtention d'informations sur des fichiers. Ici j'ai affiché les dates (création/modification/dernier accès). On utilise une structure BY_HANDLE_FILE_INFORMATION et une SYSTEMTIME Le projet VC++6 se trouve dans le zip Voici le code du fichier principal : lister.cpp
Source
- /************************************************************************************************
-
- File Browser v1.03 by BiGBANG
- -----------------------------
- SecurityHack Programming Contest, August 2oo4
-
- History :
- ---------
-
- v1.03
- - Filters for visualisation of files
- - Two languages interface : French and English
-
- v1.02
- - File visualisation. Filter needed
-
- v1.01
- - Subclassing
- - Numbers of Folders/Files
- - File Informations
- - Bitmap/AboutBox
-
- v1.00
- - File Browser only :)
-
-
- ************************************************************************************************/
-
- #include <stdio.h> // sprintf(),...
- #include <windows.h>
- #include "resource.h"
-
- HINSTANCE hinst;
- WNDPROC oldProc; // orignal proc
- HWND hcmb,hlistFiles,hlistFolders,hMainDlg;
- char buf[MAX_PATH];
- char CurrentFile[MAX_PATH];
- char FileExt[8],buf2[8];
- char c;
- char *sz;
- int i;
- int xPos,yPos,nbFiles,nbFolders;
-
- // Eextension Filter
- char *ExtensionsOK="txt,bat,ini,c,cpp,asm,log,rc,res,dat,"; // a coma between them
- // a terminal coma
-
- /*
- * Texts
- */
- // French
- char AppTitle[]="Listeur de fichiers v1.03 - BiGBANG - Security Hack Concours - 17/08/2004";
- char AppDisks[]="Liste des lecteurs :";
- char AppToList[]="Répertoire à lister :";
- char AppNumFolders[]="Nombre de dossiers :";
- char AppNumFiles[]="Nombre de fichiers :";
- char AppName[]="Nom :";
- char AppFileSize[]="Taille";
- char AppFileCreation[]="Date de création";
- char AppLastWrite[]="Date de denier écriture";
- char AppLastAccess[]="Date de denier accès";
- char AppDateFormat[]="Format de la date : jj/mm/aaaa";
- char SeeFileTitle[]="Vue de fichiers";
- char SeeFileCurrentFile[]="Fichier en cours";
- char MsgError1[]="Le fichier n'existe pas";
- char MsgError2[]="Impossible de mapper le fichier";
- char MsgError3[]="Impossible de mapper le fichier. Fichier vide ?";
- char MsgError4[]="Aucun lecteur trouvé. Le programme va se fermer.";
- char MsgError5[]="Dossier inexistant";
- char MsgError6[]="L'extension de ce fichier n'autorise pas sa visualisation.";
- char AboutText[]="Listeur de fichiers pour le concours de programmation sur le forum de SecurityHack\n\nAuteur: Bigbang\nLangage: Win32Cpp\nDernière MAJ: 17 Août 2004\n\nGreetings to:\nCharlotte, Shad0w, P41f0x, Neitsa, Sigma, Nelio, Xiutecutli, le_rasta, Dark-Jedi,\nsn0oPy, Mattwood9, les challenges du BigContest, et tout ceux que j'ai oublié...";
- char AboutTitle[]="A propos...";
-
- /*
- // English
- char AppTitle[]="File Browser v1.03 - BiGBANG - Security Hack Contest - 17/08/2004";
- char AppDisks[]="List of drives:";
- char AppToList[]="Folder to list :";
- char AppNumFolders[]="Number of folders :";
- char AppNumFiles[]="Number of files :";
- char AppName[]="Name :";
- char AppFileSize[]="Size";
- char AppFileCreation[]="Create on the";
- char AppLastWrite[]="Last write on the";
- char AppLastAccess[]="Last access on the";
- char AppDateFormat[]="Date format : dd/mm/yyyy";
- char SeeFileTitle[]="File Visualisation";
- char SeeFileCurrentFile[]="Current File";
- char MsgError1[]="File doesn't exist";
- char MsgError2[]="File mapping failed";
- char MsgError3[]="File mapping failed. Maybe the file is empty";
- char MsgError4[]="0 drives found. Program will end";
- char MsgError5[]="Folder doesn't exist";
- char MsgError6[]="The extension of this file doesn't match for visualisation";
- char AboutText[]="File browser for SecurityHack Programming contest\n\nAuthor: Bigbang\nLanguage: Win32Cpp\nLast update: 17 Août 2004\n\nGreetings to:\nCharlotte, Shad0w, P41f0x, Neitsa, Sigma, Nelio, Xiutecutli, le_rasta, Dark-Jedi,\nsn0oPy, Mattwood9, BigContest's challengers, and all I forgot...";
- char AboutTitle[]="About...";
- */
-
-
-
- /*
- * Find drive(s) and Fill Combo Box
- *
- * Return Value:
- * number of drive(s)
- */
- int __stdcall FillCmbDrives()
- {
- DWORD dwResult;
- int nb=0;
- char szDrive[]="A:\\";
-
- /******** MSDN says : ***************
- Thee GetLogicalDrives function retrieves a bitmask representing the currently
- available disk drives.
-
- DWORD GetLogicalDrives(void);
-
- Parameters
- This function has no parameters.
-
- Return Values
- If the function succeeds, the return value is a bitmask representing the currently
- available disk drives. Bit position 0 (the least-significant bit) is drive A,
- bit position 1 is drive B, bit position 2 is drive C, and so on.
- ---
- DRIVE_FIXED The disk cannot be removed from the drive.
- **************************************/
-
- dwResult = GetLogicalDrives();
- // if(dwResult==0) return 0;
-
- while(dwResult!=0)
- {
- // only one BYTE
- if((dwResult&1)&&(GetDriveType(szDrive)==DRIVE_FIXED)) SendMessage(hcmb,CB_ADDSTRING,0,(long)szDrive);
- szDrive[0]++; // A, B, C, ...
- nb++;
- dwResult=dwResult>>1; // shr dwResult, 1
- }
-
- SendMessage(hcmb, CB_SETCURSEL, 0, 0); // selection on first item
-
- return nb;
- }
-
- /*
- * NB: Modified proc seen in MSDN samples
- *
- * Get dir, and list files/subdirs
- * it uses FindFirstFile/FindNextFile method
- *
- * Return value : 0 Error
- * 1 w00t!
- */
- int __stdcall ListFiles(HWND hdlg)
- {
- WIN32_FIND_DATA FindFileData;
- HANDLE hFind = INVALID_HANDLE_VALUE;
- char DirSpec[MAX_PATH]; // directory specification
- DWORD dwError;
- char folder[MAX_PATH];
- HWND hTmp;
- char number[8];
-
- memset(&folder,0,sizeof(folder));
- memset(&FindFileData,0,sizeof(WIN32_FIND_DATA));
- memset(&number,0,sizeof(number));
-
- nbFiles=0;
- nbFolders=0;
-
- GetDlgItemText(hdlg,ID_TXT_DIR,folder,MAX_PATH); // get current folder
-
- strncpy (DirSpec, folder, strlen(folder)+1);
- if(*(folder+strlen(folder)-1)!='\\') strncat (DirSpec, "\\", 1);
- strncat (DirSpec, "*", 1);
-
- hFind = FindFirstFile(DirSpec, &FindFileData);
-
-
- if (hFind == INVALID_HANDLE_VALUE) return 0;
- else
- {
- // Clear List Boxes
- SendMessage(hlistFiles, LB_RESETCONTENT, 0, 0);
- SendMessage(hlistFolders, LB_RESETCONTENT, 0, 0);
-
- // First file
- if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- {
- hTmp=hlistFolders;
- nbFolders++;
- }
- else
- {
- hTmp=hlistFiles;
- nbFiles++;
- }
-
- SendMessage(hTmp,LB_ADDSTRING,0,(long)FindFileData.cFileName);
-
- while (FindNextFile(hFind, &FindFileData) != 0)
- {
- // Next Files
- if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
- {
- hTmp=hlistFolders;
- nbFolders++;
- }
- else
- {
- hTmp=hlistFiles;
- nbFiles++;
- }
-
- SendMessage(hTmp,LB_ADDSTRING,0,(long)FindFileData.cFileName);
- }
-
- // Set Numbers Files/Folders numbers
- itoa(nbFiles,number,10);
- SetDlgItemText(hdlg,ID_ST_NBFILES,number);
- itoa(nbFolders,number,10);
- SetDlgItemText(hdlg,ID_ST_NBFOLDERS,number);
-
- dwError = GetLastError();
- if (dwError == ERROR_NO_MORE_FILES)
- {
- FindClose(hFind);
- return 1;
- }
- else
- {
- return 0;
- }
- }
- }
-
- void __stdcall ChangeFolder(HWND hdlg)
- {
- char dir[MAX_PATH];
- memset(&dir,0,sizeof(dir));
- char *sz;
-
- SendMessage(hlistFolders,LB_GETTEXT,SendMessage(hlistFolders,LB_GETCURSEL,0,0),(long)buf);
- GetDlgItemText(hdlg,ID_TXT_DIR,dir,sizeof(dir));
-
- if(*(dir+strlen(dir)-1)!='\\') strncat(dir, "\\", 1);
-
- // different cases
- if(!strcmp(buf,".")) *(dir+3)=0; // go to root
- else if(!strcmp(buf,".."))
- {
- sz=dir+strlen(dir)-2;
- while(*sz!='\\') sz--;
- *sz=0;
- }
- else strcat(dir,buf);
-
- SetDlgItemText(hdlg,ID_TXT_DIR,dir);
-
- // ask for listing THiS folder
- SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
-
- }
-
- /*
- * GetFileExtension
- */
- void GetFileExtension(char *szFilename)
- {
- char *sz;
- memset(&FileExt,0,sizeof(FileExt));
- sz=szFilename+strlen(szFilename)-1;
- while(*sz!='.') sz--;
- sz++;
- strcpy(FileExt,sz);
- }
-
- /*
- * Extension Filter
- */
- BOOL CheckExtension(HWND hdlg)
- {
- /*
-
- txt,pl,bat,ini,c,cpp,asm << ExtensionsOK
-
- ini << bad. continue
- ini << bad. continue
- ini << bad. continue
- ini << w00t. break -> Goto
- */
-
- memset(&CurrentFile,0,sizeof(CurrentFile));
- SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
-
- SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
-
- GetFileExtension(CurrentFile); //MessageBox(hdlg,FileExt,"FileExt",0);
- CharLower(FileExt);
- i=0;c=0;sz=ExtensionsOK;
-
- while((c=*sz)!=0)
- {
- if(c!=',') *(buf2+i)=*sz;
- else
- {
- //MessageBox(hdlg,buf2,"buf2",0);
- //MessageBox(hdlg,FileExt,"FileExt",0);
-
- if(strcmp(buf2,FileExt)==0) goto _ExtOk;
- i=-1;
- memset(&buf2,0,sizeof(buf2));
- }
- i++;sz++;
- }
- return false;
- _ExtOk:
- return true;
- }
-
-
- BOOL CALLBACK SeeFileProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
- {
- switch(mssg)
- {
- case WM_INITDIALOG:
- {
- HANDLE hMapFile,hfile;
- LPCTSTR pBuf;
-
- // Set title
- SetWindowText(hdlg,SeeFileTitle);
- SetDlgItemText(hdlg,ID_ST_CURRENTFILE,SeeFileCurrentFile);
-
- memset(&buf,0,sizeof(buf));
-
- GetDlgItemText(hMainDlg,ID_TXT_DIR,CurrentFile,sizeof(CurrentFile));
-
- strcat(buf,CurrentFile);
- if(*(buf+strlen(buf)-1)!='\\') { *(buf+strlen(buf))='\\'; *(buf+strlen(buf)+1)='\\'; }
- memset(&CurrentFile,0,sizeof(CurrentFile));
- SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
- strcat(buf,CurrentFile);
- SetDlgItemText(hdlg,ID_TXT_CURRENTFILE,buf);
-
- // map the file
- if((hfile = CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0))==INVALID_HANDLE_VALUE)
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError1);
- return 1;
- }
-
- hMapFile = CreateFileMapping(hfile,NULL,PAGE_READONLY,0,0,0);
- if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError2);
- return 1;
- }
-
- pBuf = (LPTSTR)MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
- if(pBuf == NULL)
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError3);
- return 1;
- }
-
- SetDlgItemText(hdlg,ID_TXT_SEEFILE,pBuf);
-
- UnmapViewOfFile(pBuf);
- CloseHandle(hMapFile);
- CloseHandle(hfile);
- return 1;
- }
-
-
- case WM_COMMAND:
- {
- switch(LOWORD(wParam))
- {
- case ID_BT_CLOSE:
- {
- EndDialog(hdlg, 0);
- return 0;
- }
- }
- return 0;
- }
-
-
- case WM_CLOSE:
- {
- EndDialog(hdlg, 0);
- return 0;
- }
- }
- return 0;
- }
-
- /*
- * Sets texts in all Editboxes
- */
- void SetStaticsText(HWND hdlg)
- {
- SetDlgItemText(hdlg,ID_ST_DISKS,AppDisks);
- SetDlgItemText(hdlg,ID_ST_TOLIST,AppToList);
- SetDlgItemText(hdlg,ID_ST_NUMFOLDERS,AppNumFolders);
- SetDlgItemText(hdlg,ID_ST_NUMFILES,AppNumFiles);
- SetDlgItemText(hdlg,ID_ST_NAME,AppName);
- SetDlgItemText(hdlg,ID_ST_FILESIZE,AppFileSize);
- SetDlgItemText(hdlg,ID_ST_FILECREATION,AppFileCreation);
- SetDlgItemText(hdlg,ID_ST_LASTWRITE,AppLastWrite);
- SetDlgItemText(hdlg,ID_ST_LASTACCESS,AppLastAccess);
- SetDlgItemText(hdlg,ID_ST_DATEFORMAT,AppDateFormat);
-
- }
-
-
- /*
- * Subclassing Proc
- */
- LRESULT CALLBACK TxtDirProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
- {
- if((mssg==WM_KEYDOWN)&&(wParam == VK_RETURN)) // if pressing VK_RETURN
- {
- // list folder
- SendMessage(hMainDlg,WM_COMMAND,ID_BT_LIST,0);
- return 0;
- }
- return CallWindowProc(oldProc, hwnd, mssg, wParam, lParam); // others messages
- }
-
- BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
- {
- switch(mssg)
- {
- case WM_INITDIALOG:
- {
- hMainDlg=hdlg;
-
- // icon
- SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON1)));
-
- // Set Dialog Title
- SetWindowText(hdlg,AppTitle);
- SetStaticsText(hdlg);
-
- // SubClassing edit ID_TXT_DIR
- oldProc = (WNDPROC)SetWindowLong(GetDlgItem(hdlg,ID_TXT_DIR),GWL_WNDPROC,(long)TxtDirProc);
-
- hcmb=GetDlgItem(hdlg,ID_CB_DRIVES);
- hlistFiles=GetDlgItem(hdlg,ID_LIST_FILES);
- hlistFolders=GetDlgItem(hdlg,ID_LIST_FOLDERS);
-
- if(FillCmbDrives()==0) // if no drives found
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError4);
- EndDialog(hdlg, 0);
- }
- else
- {
- GetDlgItemText(hdlg,ID_CB_DRIVES,buf,sizeof(buf));
- SetDlgItemText(hdlg,ID_TXT_DIR,buf);
- }
-
- // list root dir
- SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
-
- return 1;
- }
-
-
- /**** res.rc : **
-
- CONTROL 107,ID_BITMAP,"Static",SS_BITMAP,412,7,153,36 < l
- ^ ^ ^
- x y L
- ****************/
-
- case WM_LBUTTONDOWN:
- {
- if(wParam==MK_LBUTTON)
- {
- xPos = LOWORD(lParam);
- yPos = HIWORD(lParam);
-
- /*
- * (412+153)*1.5 = 848
- * 412*1.5 = 619
- * (7+36)*1.5 = 64 << uhuh
- * 7*1.5 = 11
- */
-
- if((xPos<=848)&&(xPos>=619)&&(yPos<=71)&&(yPos>=11))
- MessageBox(hdlg,AboutText,AboutTitle,32);
- }
- break;
- }
-
-
- case WM_COMMAND:
- {
- switch(LOWORD(wParam))
- {
- case ID_LIST_FOLDERS:
- {
- switch (HIWORD(wParam))
- {
- case LBN_DBLCLK:
- {
- ChangeFolder(hdlg);
- break;
- }
- }
-
- break;
- }
-
- case ID_LIST_FILES:
- {
- switch (HIWORD(wParam))
- {
-
- case LBN_SELCHANGE:
- {
- BY_HANDLE_FILE_INFORMATION FilesInfos;
- SYSTEMTIME SystemTime;
- HANDLE hfile;
- DWORD FileSizeHigh,FileSizeLow,
- __int64 size=0;
- char buf2[48];
- memset(&FilesInfos,0,sizeof(LPBY_HANDLE_FILE_INFORMATION));
- memset(&buf,0,sizeof(buf));
- memset(&CurrentFile,0,sizeof(CurrentFile));
- memset(&buf2,0,sizeof(buf2));
- SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
- SetDlgItemText(hdlg,ID_ST_FILENAME,NULL);
- SetDlgItemText(hdlg,ID_ST_SIZE,NULL);
- SetDlgItemText(hdlg,ID_ST_CREATION,NULL);
- SetDlgItemText(hdlg,ID_ST_ACCES,NULL);
- SetDlgItemText(hdlg,ID_ST_WRITTEN,NULL);
-
- GetDlgItemText(hMainDlg,ID_TXT_DIR,CurrentFile,sizeof(CurrentFile));
- strcat(buf,CurrentFile);
- if(*(buf+strlen(buf)-1)!='\\') { *(buf+strlen(buf))='\\'; *(buf+strlen(buf)+1)='\\'; }
- memset(&CurrentFile,0,sizeof(CurrentFile));
- SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
- SetDlgItemText(hdlg,ID_ST_FILENAME,CurrentFile); // set ID_ST_FILENAME
- strcat(buf,CurrentFile);
- SetDlgItemText(hdlg,ID_TXT_CURRENTFILE,buf);
-
-
- // Open file
- if((hfile = CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0))==INVALID_HANDLE_VALUE)
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError1);
- return 0;
- }
-
- // get infos
- GetFileInformationByHandle(hfile,&FilesInfos);
-
- // Get File Size
- FileSizeLow=GetFileSize(hfile,&FileSizeHigh);
-
-
- size=FileSizeHigh;
- size<<=8;
- size+=FileSizeLow;
-
- if(size<1000) sprintf(buf2,"%i octets",size); // in octets
- else if((size/1024)<1000) sprintf(buf2,"%i ko",size/1024); // in ko
- else sprintf(buf2,"%i Mo",(size/1024)/1024); // in Mo
-
- SetDlgItemText(hMainDlg,ID_ST_SIZE,buf2);
-
- /*
- typedef struct _BY_HANDLE_FILE_INFORMATION
- {
- DWORD dwFileAttributes;
- FILETIME ftCreationTime;
- FILETIME ftLastAccessTime;
- FILETIME ftLastWriteTime;
- DWORD dwVolumeSerialNumber;
- DWORD nFileSizeHigh;
- DWORD nFileSizeLow;
- DWORD nNumberOfLinks;
- DWORD nFileIndexHigh;
- DWORD nFileIndexLow;
- } BY_HANDLE_FILE_INFORMATION,
- *PBY_HANDLE_FILE_INFORMATION;
- */
- // ftCreationTime
- FileTimeToSystemTime(&(FilesInfos.ftCreationTime),&SystemTime);
- sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
- SetDlgItemText(hMainDlg,ID_ST_CREATION,buf2);
-
- // ftLastAccessTime
- FileTimeToSystemTime(&(FilesInfos.ftLastAccessTime),&SystemTime);
- sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
- SetDlgItemText(hMainDlg,ID_ST_ACCES,buf2);
-
- // ftLastWriteTime
- FileTimeToSystemTime(&(FilesInfos.ftLastWriteTime),&SystemTime);
- sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
- SetDlgItemText(hMainDlg,ID_ST_WRITTEN,buf2);
-
- // close file
- CloseHandle(hfile);
-
- break;
- }
-
- case LBN_DBLCLK:
- {
- if(CheckExtension(hdlg)) // if file as a *good* extension
- DialogBox(hinst, MAKEINTRESOURCE(IDD_SEEFILE), NULL,SeeFileProc);
- else
- SetDlgItemText(hdlg,ID_ST_STATUS,MsgError6);
-
- break;
- }
- }
-
- break;
- }
-
- case ID_CB_DRIVES:
- {
- switch (HIWORD(wParam))
- {
- case CBN_SELCHANGE:
- {
- SendMessage(hcmb,CB_GETLBTEXT,SendMessage(hcmb,CB_GETCURSEL,0,0),(long)buf);
- SetDlgItemText(hdlg,ID_TXT_DIR,buf);
- SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
- break;
- }
- }
- break;
-
- }
-
- case ID_BT_LIST:
- {
- SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
- if(!ListFiles(hdlg)) SetDlgItemText(hdlg,ID_ST_STATUS,MsgError5);
- return 0;
- }
-
- case ID_BT_EXIT:
- {
- EndDialog(hdlg, 0);
- return 0;
- }
- }
- return 0;
- }
-
-
- case WM_CLOSE:
- {
- EndDialog(hdlg, 0);
- return 0;
- }
- }
- return 0;
- }
-
- int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
- {
- hinst = hInstance;
- DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP), NULL, AppDlgProc);
- return 0;
-
- }
/************************************************************************************************
File Browser v1.03 by BiGBANG
-----------------------------
SecurityHack Programming Contest, August 2oo4
History :
---------
v1.03
- Filters for visualisation of files
- Two languages interface : French and English
v1.02
- File visualisation. Filter needed
v1.01
- Subclassing
- Numbers of Folders/Files
- File Informations
- Bitmap/AboutBox
v1.00
- File Browser only :)
************************************************************************************************/
#include <stdio.h> // sprintf(),...
#include <windows.h>
#include "resource.h"
HINSTANCE hinst;
WNDPROC oldProc; // orignal proc
HWND hcmb,hlistFiles,hlistFolders,hMainDlg;
char buf[MAX_PATH];
char CurrentFile[MAX_PATH];
char FileExt[8],buf2[8];
char c;
char *sz;
int i;
int xPos,yPos,nbFiles,nbFolders;
// Eextension Filter
char *ExtensionsOK="txt,bat,ini,c,cpp,asm,log,rc,res,dat,"; // a coma between them
// a terminal coma
/*
* Texts
*/
// French
char AppTitle[]="Listeur de fichiers v1.03 - BiGBANG - Security Hack Concours - 17/08/2004";
char AppDisks[]="Liste des lecteurs :";
char AppToList[]="Répertoire à lister :";
char AppNumFolders[]="Nombre de dossiers :";
char AppNumFiles[]="Nombre de fichiers :";
char AppName[]="Nom :";
char AppFileSize[]="Taille";
char AppFileCreation[]="Date de création";
char AppLastWrite[]="Date de denier écriture";
char AppLastAccess[]="Date de denier accès";
char AppDateFormat[]="Format de la date : jj/mm/aaaa";
char SeeFileTitle[]="Vue de fichiers";
char SeeFileCurrentFile[]="Fichier en cours";
char MsgError1[]="Le fichier n'existe pas";
char MsgError2[]="Impossible de mapper le fichier";
char MsgError3[]="Impossible de mapper le fichier. Fichier vide ?";
char MsgError4[]="Aucun lecteur trouvé. Le programme va se fermer.";
char MsgError5[]="Dossier inexistant";
char MsgError6[]="L'extension de ce fichier n'autorise pas sa visualisation.";
char AboutText[]="Listeur de fichiers pour le concours de programmation sur le forum de SecurityHack\n\nAuteur: Bigbang\nLangage: Win32Cpp\nDernière MAJ: 17 Août 2004\n\nGreetings to:\nCharlotte, Shad0w, P41f0x, Neitsa, Sigma, Nelio, Xiutecutli, le_rasta, Dark-Jedi,\nsn0oPy, Mattwood9, les challenges du BigContest, et tout ceux que j'ai oublié...";
char AboutTitle[]="A propos...";
/*
// English
char AppTitle[]="File Browser v1.03 - BiGBANG - Security Hack Contest - 17/08/2004";
char AppDisks[]="List of drives:";
char AppToList[]="Folder to list :";
char AppNumFolders[]="Number of folders :";
char AppNumFiles[]="Number of files :";
char AppName[]="Name :";
char AppFileSize[]="Size";
char AppFileCreation[]="Create on the";
char AppLastWrite[]="Last write on the";
char AppLastAccess[]="Last access on the";
char AppDateFormat[]="Date format : dd/mm/yyyy";
char SeeFileTitle[]="File Visualisation";
char SeeFileCurrentFile[]="Current File";
char MsgError1[]="File doesn't exist";
char MsgError2[]="File mapping failed";
char MsgError3[]="File mapping failed. Maybe the file is empty";
char MsgError4[]="0 drives found. Program will end";
char MsgError5[]="Folder doesn't exist";
char MsgError6[]="The extension of this file doesn't match for visualisation";
char AboutText[]="File browser for SecurityHack Programming contest\n\nAuthor: Bigbang\nLanguage: Win32Cpp\nLast update: 17 Août 2004\n\nGreetings to:\nCharlotte, Shad0w, P41f0x, Neitsa, Sigma, Nelio, Xiutecutli, le_rasta, Dark-Jedi,\nsn0oPy, Mattwood9, BigContest's challengers, and all I forgot...";
char AboutTitle[]="About...";
*/
/*
* Find drive(s) and Fill Combo Box
*
* Return Value:
* number of drive(s)
*/
int __stdcall FillCmbDrives()
{
DWORD dwResult;
int nb=0;
char szDrive[]="A:\\";
/******** MSDN says : ***************
Thee GetLogicalDrives function retrieves a bitmask representing the currently
available disk drives.
DWORD GetLogicalDrives(void);
Parameters
This function has no parameters.
Return Values
If the function succeeds, the return value is a bitmask representing the currently
available disk drives. Bit position 0 (the least-significant bit) is drive A,
bit position 1 is drive B, bit position 2 is drive C, and so on.
---
DRIVE_FIXED The disk cannot be removed from the drive.
**************************************/
dwResult = GetLogicalDrives();
// if(dwResult==0) return 0;
while(dwResult!=0)
{
// only one BYTE
if((dwResult&1)&&(GetDriveType(szDrive)==DRIVE_FIXED)) SendMessage(hcmb,CB_ADDSTRING,0,(long)szDrive);
szDrive[0]++; // A, B, C, ...
nb++;
dwResult=dwResult>>1; // shr dwResult, 1
}
SendMessage(hcmb, CB_SETCURSEL, 0, 0); // selection on first item
return nb;
}
/*
* NB: Modified proc seen in MSDN samples
*
* Get dir, and list files/subdirs
* it uses FindFirstFile/FindNextFile method
*
* Return value : 0 Error
* 1 w00t!
*/
int __stdcall ListFiles(HWND hdlg)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = INVALID_HANDLE_VALUE;
char DirSpec[MAX_PATH]; // directory specification
DWORD dwError;
char folder[MAX_PATH];
HWND hTmp;
char number[8];
memset(&folder,0,sizeof(folder));
memset(&FindFileData,0,sizeof(WIN32_FIND_DATA));
memset(&number,0,sizeof(number));
nbFiles=0;
nbFolders=0;
GetDlgItemText(hdlg,ID_TXT_DIR,folder,MAX_PATH); // get current folder
strncpy (DirSpec, folder, strlen(folder)+1);
if(*(folder+strlen(folder)-1)!='\\') strncat (DirSpec, "\\", 1);
strncat (DirSpec, "*", 1);
hFind = FindFirstFile(DirSpec, &FindFileData);
if (hFind == INVALID_HANDLE_VALUE) return 0;
else
{
// Clear List Boxes
SendMessage(hlistFiles, LB_RESETCONTENT, 0, 0);
SendMessage(hlistFolders, LB_RESETCONTENT, 0, 0);
// First file
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
hTmp=hlistFolders;
nbFolders++;
}
else
{
hTmp=hlistFiles;
nbFiles++;
}
SendMessage(hTmp,LB_ADDSTRING,0,(long)FindFileData.cFileName);
while (FindNextFile(hFind, &FindFileData) != 0)
{
// Next Files
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
hTmp=hlistFolders;
nbFolders++;
}
else
{
hTmp=hlistFiles;
nbFiles++;
}
SendMessage(hTmp,LB_ADDSTRING,0,(long)FindFileData.cFileName);
}
// Set Numbers Files/Folders numbers
itoa(nbFiles,number,10);
SetDlgItemText(hdlg,ID_ST_NBFILES,number);
itoa(nbFolders,number,10);
SetDlgItemText(hdlg,ID_ST_NBFOLDERS,number);
dwError = GetLastError();
if (dwError == ERROR_NO_MORE_FILES)
{
FindClose(hFind);
return 1;
}
else
{
return 0;
}
}
}
void __stdcall ChangeFolder(HWND hdlg)
{
char dir[MAX_PATH];
memset(&dir,0,sizeof(dir));
char *sz;
SendMessage(hlistFolders,LB_GETTEXT,SendMessage(hlistFolders,LB_GETCURSEL,0,0),(long)buf);
GetDlgItemText(hdlg,ID_TXT_DIR,dir,sizeof(dir));
if(*(dir+strlen(dir)-1)!='\\') strncat(dir, "\\", 1);
// different cases
if(!strcmp(buf,".")) *(dir+3)=0; // go to root
else if(!strcmp(buf,".."))
{
sz=dir+strlen(dir)-2;
while(*sz!='\\') sz--;
*sz=0;
}
else strcat(dir,buf);
SetDlgItemText(hdlg,ID_TXT_DIR,dir);
// ask for listing THiS folder
SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
}
/*
* GetFileExtension
*/
void GetFileExtension(char *szFilename)
{
char *sz;
memset(&FileExt,0,sizeof(FileExt));
sz=szFilename+strlen(szFilename)-1;
while(*sz!='.') sz--;
sz++;
strcpy(FileExt,sz);
}
/*
* Extension Filter
*/
BOOL CheckExtension(HWND hdlg)
{
/*
txt,pl,bat,ini,c,cpp,asm << ExtensionsOK
ini << bad. continue
ini << bad. continue
ini << bad. continue
ini << w00t. break -> Goto
*/
memset(&CurrentFile,0,sizeof(CurrentFile));
SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
GetFileExtension(CurrentFile); //MessageBox(hdlg,FileExt,"FileExt",0);
CharLower(FileExt);
i=0;c=0;sz=ExtensionsOK;
while((c=*sz)!=0)
{
if(c!=',') *(buf2+i)=*sz;
else
{
//MessageBox(hdlg,buf2,"buf2",0);
//MessageBox(hdlg,FileExt,"FileExt",0);
if(strcmp(buf2,FileExt)==0) goto _ExtOk;
i=-1;
memset(&buf2,0,sizeof(buf2));
}
i++;sz++;
}
return false;
_ExtOk:
return true;
}
BOOL CALLBACK SeeFileProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg)
{
case WM_INITDIALOG:
{
HANDLE hMapFile,hfile;
LPCTSTR pBuf;
// Set title
SetWindowText(hdlg,SeeFileTitle);
SetDlgItemText(hdlg,ID_ST_CURRENTFILE,SeeFileCurrentFile);
memset(&buf,0,sizeof(buf));
GetDlgItemText(hMainDlg,ID_TXT_DIR,CurrentFile,sizeof(CurrentFile));
strcat(buf,CurrentFile);
if(*(buf+strlen(buf)-1)!='\\') { *(buf+strlen(buf))='\\'; *(buf+strlen(buf)+1)='\\'; }
memset(&CurrentFile,0,sizeof(CurrentFile));
SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
strcat(buf,CurrentFile);
SetDlgItemText(hdlg,ID_TXT_CURRENTFILE,buf);
// map the file
if((hfile = CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0))==INVALID_HANDLE_VALUE)
{
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError1);
return 1;
}
hMapFile = CreateFileMapping(hfile,NULL,PAGE_READONLY,0,0,0);
if (hMapFile == NULL || hMapFile == INVALID_HANDLE_VALUE)
{
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError2);
return 1;
}
pBuf = (LPTSTR)MapViewOfFile(hMapFile,FILE_MAP_READ,0,0,0);
if(pBuf == NULL)
{
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError3);
return 1;
}
SetDlgItemText(hdlg,ID_TXT_SEEFILE,pBuf);
UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);
CloseHandle(hfile);
return 1;
}
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_BT_CLOSE:
{
EndDialog(hdlg, 0);
return 0;
}
}
return 0;
}
case WM_CLOSE:
{
EndDialog(hdlg, 0);
return 0;
}
}
return 0;
}
/*
* Sets texts in all Editboxes
*/
void SetStaticsText(HWND hdlg)
{
SetDlgItemText(hdlg,ID_ST_DISKS,AppDisks);
SetDlgItemText(hdlg,ID_ST_TOLIST,AppToList);
SetDlgItemText(hdlg,ID_ST_NUMFOLDERS,AppNumFolders);
SetDlgItemText(hdlg,ID_ST_NUMFILES,AppNumFiles);
SetDlgItemText(hdlg,ID_ST_NAME,AppName);
SetDlgItemText(hdlg,ID_ST_FILESIZE,AppFileSize);
SetDlgItemText(hdlg,ID_ST_FILECREATION,AppFileCreation);
SetDlgItemText(hdlg,ID_ST_LASTWRITE,AppLastWrite);
SetDlgItemText(hdlg,ID_ST_LASTACCESS,AppLastAccess);
SetDlgItemText(hdlg,ID_ST_DATEFORMAT,AppDateFormat);
}
/*
* Subclassing Proc
*/
LRESULT CALLBACK TxtDirProc(HWND hwnd, UINT mssg, WPARAM wParam, LPARAM lParam)
{
if((mssg==WM_KEYDOWN)&&(wParam == VK_RETURN)) // if pressing VK_RETURN
{
// list folder
SendMessage(hMainDlg,WM_COMMAND,ID_BT_LIST,0);
return 0;
}
return CallWindowProc(oldProc, hwnd, mssg, wParam, lParam); // others messages
}
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam)
{
switch(mssg)
{
case WM_INITDIALOG:
{
hMainDlg=hdlg;
// icon
SetClassLong(hdlg, GCL_HICON, (long)LoadIcon(hinst, MAKEINTRESOURCE(IDI_ICON1)));
// Set Dialog Title
SetWindowText(hdlg,AppTitle);
SetStaticsText(hdlg);
// SubClassing edit ID_TXT_DIR
oldProc = (WNDPROC)SetWindowLong(GetDlgItem(hdlg,ID_TXT_DIR),GWL_WNDPROC,(long)TxtDirProc);
hcmb=GetDlgItem(hdlg,ID_CB_DRIVES);
hlistFiles=GetDlgItem(hdlg,ID_LIST_FILES);
hlistFolders=GetDlgItem(hdlg,ID_LIST_FOLDERS);
if(FillCmbDrives()==0) // if no drives found
{
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError4);
EndDialog(hdlg, 0);
}
else
{
GetDlgItemText(hdlg,ID_CB_DRIVES,buf,sizeof(buf));
SetDlgItemText(hdlg,ID_TXT_DIR,buf);
}
// list root dir
SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
return 1;
}
/**** res.rc : **
CONTROL 107,ID_BITMAP,"Static",SS_BITMAP,412,7,153,36 < l
^ ^ ^
x y L
****************/
case WM_LBUTTONDOWN:
{
if(wParam==MK_LBUTTON)
{
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
/*
* (412+153)*1.5 = 848
* 412*1.5 = 619
* (7+36)*1.5 = 64 << uhuh
* 7*1.5 = 11
*/
if((xPos<=848)&&(xPos>=619)&&(yPos<=71)&&(yPos>=11))
MessageBox(hdlg,AboutText,AboutTitle,32);
}
break;
}
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case ID_LIST_FOLDERS:
{
switch (HIWORD(wParam))
{
case LBN_DBLCLK:
{
ChangeFolder(hdlg);
break;
}
}
break;
}
case ID_LIST_FILES:
{
switch (HIWORD(wParam))
{
case LBN_SELCHANGE:
{
BY_HANDLE_FILE_INFORMATION FilesInfos;
SYSTEMTIME SystemTime;
HANDLE hfile;
DWORD FileSizeHigh,FileSizeLow,
__int64 size=0;
char buf2[48];
memset(&FilesInfos,0,sizeof(LPBY_HANDLE_FILE_INFORMATION));
memset(&buf,0,sizeof(buf));
memset(&CurrentFile,0,sizeof(CurrentFile));
memset(&buf2,0,sizeof(buf2));
SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
SetDlgItemText(hdlg,ID_ST_FILENAME,NULL);
SetDlgItemText(hdlg,ID_ST_SIZE,NULL);
SetDlgItemText(hdlg,ID_ST_CREATION,NULL);
SetDlgItemText(hdlg,ID_ST_ACCES,NULL);
SetDlgItemText(hdlg,ID_ST_WRITTEN,NULL);
GetDlgItemText(hMainDlg,ID_TXT_DIR,CurrentFile,sizeof(CurrentFile));
strcat(buf,CurrentFile);
if(*(buf+strlen(buf)-1)!='\\') { *(buf+strlen(buf))='\\'; *(buf+strlen(buf)+1)='\\'; }
memset(&CurrentFile,0,sizeof(CurrentFile));
SendMessage(hlistFiles,LB_GETTEXT,SendMessage(hlistFiles,LB_GETCURSEL,0,0),(long)CurrentFile);
SetDlgItemText(hdlg,ID_ST_FILENAME,CurrentFile); // set ID_ST_FILENAME
strcat(buf,CurrentFile);
SetDlgItemText(hdlg,ID_TXT_CURRENTFILE,buf);
// Open file
if((hfile = CreateFile(buf,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0))==INVALID_HANDLE_VALUE)
{
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError1);
return 0;
}
// get infos
GetFileInformationByHandle(hfile,&FilesInfos);
// Get File Size
FileSizeLow=GetFileSize(hfile,&FileSizeHigh);
size=FileSizeHigh;
size<<=8;
size+=FileSizeLow;
if(size<1000) sprintf(buf2,"%i octets",size); // in octets
else if((size/1024)<1000) sprintf(buf2,"%i ko",size/1024); // in ko
else sprintf(buf2,"%i Mo",(size/1024)/1024); // in Mo
SetDlgItemText(hMainDlg,ID_ST_SIZE,buf2);
/*
typedef struct _BY_HANDLE_FILE_INFORMATION
{
DWORD dwFileAttributes;
FILETIME ftCreationTime;
FILETIME ftLastAccessTime;
FILETIME ftLastWriteTime;
DWORD dwVolumeSerialNumber;
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD nNumberOfLinks;
DWORD nFileIndexHigh;
DWORD nFileIndexLow;
} BY_HANDLE_FILE_INFORMATION,
*PBY_HANDLE_FILE_INFORMATION;
*/
// ftCreationTime
FileTimeToSystemTime(&(FilesInfos.ftCreationTime),&SystemTime);
sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
SetDlgItemText(hMainDlg,ID_ST_CREATION,buf2);
// ftLastAccessTime
FileTimeToSystemTime(&(FilesInfos.ftLastAccessTime),&SystemTime);
sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
SetDlgItemText(hMainDlg,ID_ST_ACCES,buf2);
// ftLastWriteTime
FileTimeToSystemTime(&(FilesInfos.ftLastWriteTime),&SystemTime);
sprintf(buf2,"%02i/%02i/%i",(int)SystemTime.wDay,(int)SystemTime.wMonth,(int)SystemTime.wYear);
SetDlgItemText(hMainDlg,ID_ST_WRITTEN,buf2);
// close file
CloseHandle(hfile);
break;
}
case LBN_DBLCLK:
{
if(CheckExtension(hdlg)) // if file as a *good* extension
DialogBox(hinst, MAKEINTRESOURCE(IDD_SEEFILE), NULL,SeeFileProc);
else
SetDlgItemText(hdlg,ID_ST_STATUS,MsgError6);
break;
}
}
break;
}
case ID_CB_DRIVES:
{
switch (HIWORD(wParam))
{
case CBN_SELCHANGE:
{
SendMessage(hcmb,CB_GETLBTEXT,SendMessage(hcmb,CB_GETCURSEL,0,0),(long)buf);
SetDlgItemText(hdlg,ID_TXT_DIR,buf);
SendMessage(hdlg,WM_COMMAND,ID_BT_LIST,0);
break;
}
}
break;
}
case ID_BT_LIST:
{
SetDlgItemText(hdlg,ID_ST_STATUS,NULL);
if(!ListFiles(hdlg)) SetDlgItemText(hdlg,ID_ST_STATUS,MsgError5);
return 0;
}
case ID_BT_EXIT:
{
EndDialog(hdlg, 0);
return 0;
}
}
return 0;
}
case WM_CLOSE:
{
EndDialog(hdlg, 0);
return 0;
}
}
return 0;
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, PSTR, int)
{
hinst = hInstance;
DialogBox(hInstance, MAKEINTRESOURCE(IDD_APP), NULL, AppDlgProc);
return 0;
}
Conclusion
Toutes remarques sont les bienvenues
Bonne journée Bigbang
Historique
Sources de la même categorie
Commentaires et avis
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : WIN APIRE : WIN API par racpp
Cliquez pour lire la suite par racpp WIN APIWIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|