begin process at 2012 05 27 15:15:11
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

API

 > CRÉER DES RACCOURCIS BUREAU ET MENU DÉMARRER

CRÉER DES RACCOURCIS BUREAU ET MENU DÉMARRER


 Information sur la source

Note :
9 / 10 - par 1 personne
9,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :API Niveau :Débutant Date de création :18/12/2004 Vu / téléchargé :17 063 / 574

Auteur : racpp

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Cliquez pour voir la capture en taille normale
Suite à une question du forum, voici un code source qui montre comment créer des raccourcis Bureau ou dans le menu Démarrer (et Programmes). Le coeur de ce petit utilitaire est une fonction qui utilise l'interface IShellLink. Cette fonction reçoit 6 paramètres:
1- Le HWND de la fenêtre ou boite de dialogue mère pour afficher les MessageBox.
2- Un pointeur sur un tableau de 3 BOOL. L'élément 0 correspond au Bureau, 1 au menu Démarrer et 2 au menu Programmes. L'état de l'élément détermine si le raccourci sera créé à cet endroit ou non.
3- Nom du raccourci.
4- Description du raccourci. Elle apparait dans une info-bulle quand on pointe le raccourci.
5- Nom du groupe du menu Démarrer (ou Programmes) dans lequel sera créé le raccourci.
6- Le chemin du raccourci.
Elle retourne le nombre de raccourcis créés.
Elle est facilement modifiable pour l'adapter à vos besoins. J'espère qu'elle vous sera utile.
Ce petit programme n'utilise pas de ressources. Réalisé sous Visual C++ 6 et testé sur Windows 2000. Si vous trouvez des bugs, merci de me les signaler.

Source

  • #include <windows.h>
  • #include <shlobj.h>
  • #include <commdlg.h>
  • /********************* Fonction de création des raccourcis ********************/
  • int Raccourci(HWND parent,BOOL* emplacement,char* name,char* description,char* group,char* path)
  • {
  • // Variable contenant le nombre de raccourcis créés:
  • int nombre=0;
  • // Créer un buffer pour recevoir le chemin d'un dossier spécial:
  • char buffer[MAX_PATH];
  • // Mettre les identificateurs des dossiers spéciaux dans un tableau:
  • int destination[3];
  • destination[0]=CSIDL_DESKTOP;
  • destination[1]=CSIDL_STARTMENU;
  • destination[2]=CSIDL_PROGRAMS;
  • // Si aucun emplacement n'est choisi alors retour:
  • if(!emplacement[0] && !emplacement[1] && !emplacement[2]) return 0;
  • //Vérifier si le chemin ou le fichier est trouvable:
  • if (GetFileAttributes(path)== -1)
  • {
  • MessageBox(parent,"Chemin ou fichier introuvable!","Créateur De Raccourcis",0);
  • return 0;
  • }
  • // Initialiser la librairie COM pour notre programme:
  • CoInitialize(NULL);
  • // Déclarer un pointeur sur IShellLink:
  • IShellLink* psl;
  • // Créer une instance de l'interface IShellLink:
  • HRESULT res = CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID *)&psl);
  • //Si instance créées avec succès:
  • if (SUCCEEDED(res))
  • {
  • // Déclarer un pointeur sur IPersistFile:
  • IPersistFile* ppf;
  • // Obtenir une interface IPersistFile:
  • psl->QueryInterface(IID_IPersistFile,(LPVOID *)&ppf);
  • // Ajout des raccourcis:
  • for (int i=0;i<3;i++)
  • {
  • // Si emplacement non choisi alors aller au suivant:
  • if (!emplacement[i]) continue;
  • // Obtenir le chemin du dosier spécial en cours:
  • SHGetSpecialFolderPath(0,buffer,destination[i],0);
  • strcat(buffer,"\\");
  • // Créer le groupe si son nom est spécifié:
  • if (i && strlen(group))
  • {
  • // Ajouter le nom du groupe au chemin:
  • strcat(buffer,group);
  • strcat(buffer,"\\");
  • // Créer le goupe:
  • CreateDirectory(buffer,0);
  • }
  • // Former le chemin complet de l'emplacement du raccourci:
  • strcat(buffer,name);
  • strcat(buffer,".lnk");
  • // Vérifier si le raccourci n'existe déjà:
  • if (GetFileAttributes(buffer)!= -1)
  • {
  • char existe[325];
  • strcpy(existe,"Le raccourci suivant existe déjà:\n");
  • strcat(existe,buffer);
  • strcat(existe,"\nVoulez-vous le remplacer?");
  • int choix=MessageBox(parent,existe,"Createur De Raccourcis",MB_YESNO);
  • if (choix==IDNO) continue;
  • }
  • // Définir le chemin du raccourci:
  • psl->SetPath(path);
  • // Définir la description:
  • psl->SetDescription(description);
  • // Convertir le chemin en UNICODE:
  • WORD chaine[MAX_PATH];
  • MultiByteToWideChar(CP_ACP, 0,buffer, -1,(LPWSTR)chaine, MAX_PATH);
  • // Créer le raccourci:
  • ppf->Save((LPWSTR)chaine, 1);
  • // Incrémenter le compteur de raccourcis créés:
  • nombre++;
  • }
  • // Libérer l'interface IPersistFile:
  • ppf->Release();
  • }
  • // Libérer l'interface IShellLink:
  • psl->Release();
  • // Fermer la librairie COM:
  • CoUninitialize();
  • // Former une chaine à partir du compteur pour l'afficher dans un MessageBox:
  • char str[30];
  • itoa(nombre,str,10);
  • strcat(str," raccourci(s) créé(s) avec succès!");
  • MessageBox(parent,str,"Créateur De Raccourcis",0);
  • // Retourner le nombre de raccourcis créés:
  • return nombre;
  • }
  • /********************************************************************/
  • /**************** Procédure de la boite de dialogue ***************/
  • BOOL CALLBACK DialogProc( HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam )
  • {
  • // Déclaration des variables:
  • static HWND hStatic1,hStatic2,hStatic3,hStatic4;
  • static HWND hEdit1,hEdit2,hEdit3,hEdit4;
  • static HWND hCreer,hQuitter,hParcourir;
  • static HWND hCadre,hCheck1,hCheck2,hCheck3;
  • static char tampon[MAX_PATH];
  • switch (message)
  • {
  • case WM_INITDIALOG:// Initialisation de la boite de dialogue
  • {
  • // Définir le titre de la boite de dialogue:
  • SetWindowText(hDlg,"Créateur De Raccourcis");
  • // Créer tous les controles:
  • hStatic1=CreateWindowEx(0,"STATIC","Nom : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,27,90,20,hDlg,0,0,0);
  • hStatic2=CreateWindowEx(0,"STATIC","Description : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,61,90,20,hDlg,0,0,0);
  • hStatic3=CreateWindowEx(0,"STATIC","Groupe : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,95,90,20,hDlg,0,0,0);
  • hStatic4=CreateWindowEx(0,"STATIC","Chemin : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,129,90,20,hDlg,0,0,0);
  • hEdit1=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,25,220,20,hDlg,0,0,0);
  • hEdit2=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,59,220,20,hDlg,0,0,0);
  • hEdit3=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,93,220,20,hDlg,0,0,0);
  • hEdit4=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,127,220,20,hDlg,0,0,0);
  • hCadre=CreateWindowEx(0,"BUTTON","Emplacement du raccourci :",WS_CHILD | WS_VISIBLE | BS_GROUPBOX,15,160,395,55,hDlg,0,0,0);
  • hCheck1=CreateWindowEx(0,"BUTTON","Bureau",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,25,186,70,20,hDlg,0,0,0);
  • hCheck2=CreateWindowEx(0,"BUTTON","Menu Démarrer",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,115,186,125,20,hDlg,0,0,0);
  • hCheck3=CreateWindowEx(0,"BUTTON","Menu Programmes",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,260,186,145,20,hDlg,0,0,0);
  • hCreer=CreateWindowEx(0,"BUTTON","Créer",WS_CHILD | WS_VISIBLE ,340,23,70,24,hDlg,0,0,0);
  • hQuitter=CreateWindowEx(0,"BUTTON","Quitter",WS_CHILD | WS_VISIBLE ,340,74,70,24,hDlg,0,0,0);
  • hParcourir=CreateWindowEx(0,"BUTTON","Parcourir",WS_CHILD | WS_VISIBLE ,340,125,70,24,hDlg,0,0,0);
  • // Limiter la longueur du contenu des EDITs:
  • SendMessage(hEdit1,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
  • SendMessage(hEdit2,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
  • SendMessage(hEdit3,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
  • SendMessage(hEdit4,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
  • // Cocher le CheckBox "Bureau":
  • SendMessage(hCheck1,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
  • // Mettre le focus dans le champ "Nom":
  • SetFocus(hEdit1);
  • return 0;
  • }
  • case WM_COMMAND:// Action sur l'un des controles
  • {
  • // Déterminer l'état des CheckBoxes:
  • BOOL bureau=SendMessage(hCheck1,BM_GETCHECK,0,0)==BST_CHECKED;
  • BOOL demarrer=SendMessage(hCheck2,BM_GETCHECK,0,0)==BST_CHECKED;
  • BOOL programmes=SendMessage(hCheck3,BM_GETCHECK,0,0)==BST_CHECKED;
  • // Griser les champs ou les boutons selon l'état des CheckBoxes:
  • BOOL state=bureau || demarrer || programmes;
  • EnableWindow(hEdit1,state);
  • EnableWindow(hStatic1,state);
  • EnableWindow(hEdit2,state);
  • EnableWindow(hStatic2,state);
  • EnableWindow(hEdit3,demarrer || programmes);
  • EnableWindow(hStatic3,demarrer || programmes);
  • EnableWindow(hEdit4,state);
  • EnableWindow(hStatic4,state);
  • EnableWindow(hParcourir,state);
  • // Griser le bouton "Créer" si "Nom" et "Chemin" sont vides ou les CheckBoxes décochés:
  • GetWindowText(hEdit1,tampon,sizeof(tampon));
  • int lennom=strlen(tampon);
  • GetWindowText(hEdit4,tampon,sizeof(tampon));
  • int lenchemin=strlen(tampon);
  • EnableWindow(hCreer,lennom && lenchemin>=2 && (state));
  • // Clic sur le bouton "Créer":
  • if( (HWND)lParam == hCreer)
  • {
  • // Passer le contenu des champs dans des variables:
  • char nom[MAX_PATH];
  • GetWindowText(hEdit1,nom,MAX_PATH);
  • char description[MAX_PATH];
  • GetWindowText(hEdit2,description,MAX_PATH);
  • char groupe[MAX_PATH];
  • GetWindowText(hEdit3,groupe,MAX_PATH);
  • char chemin[MAX_PATH];
  • GetWindowText(hEdit4,chemin,MAX_PATH);
  • // Passer l'etat des CheckBoxes dans un tableau;
  • BOOL etat[3]; etat[0]=bureau; etat[1]=demarrer; etat[2]=programmes;
  • // Appeler la fonction de création de raccourcis:
  • int nbr=Raccourci(hDlg,etat,nom,description,groupe,chemin);
  • // Si succès effacer les champs:
  • if (nbr)
  • {
  • SetWindowText(hEdit1,0);
  • SetWindowText(hEdit2,0);
  • SetWindowText(hEdit3,0);
  • SetWindowText(hEdit4,0);
  • }
  • // Mettre le focus dans le champ "Nom":
  • SetFocus(hEdit1);
  • break;
  • }
  • // Clic sur le bouton "Parcourir":
  • if( (HWND)lParam == hParcourir)
  • {
  • // Déclarer une structure OPENFILENAME:
  • OPENFILENAME ofn;
  • // Mettre tous les membres de la structure à 0:
  • memset( &ofn, 0, sizeof(OPENFILENAME) );
  • // Définir les membres:
  • ofn.lStructSize = sizeof(OPENFILENAME);
  • ofn.hwndOwner = hDlg;
  • ofn.lpstrFilter = "Tous les fichiers\0*.*\0\0";
  • strcpy(tampon,"*.*");
  • ofn.lpstrFile = tampon;
  • ofn.nMaxFile = MAX_PATH;
  • ofn.lpstrTitle = "Choisir un fichier";
  • ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
  • // Lancer la boite de dialogue pour choisir un fichier:
  • if (GetOpenFileName(&ofn))SetWindowText(hEdit4,tampon);
  • // Mettre le focus dans le champ "Chemin":
  • SetFocus(hEdit4);
  • break;
  • }
  • // Clic sur le bouton "Quitter":
  • if( (HWND)lParam == hQuitter)
  • {
  • // Fermeture de la boite de dialogue:
  • EndDialog(hDlg,0);
  • return 1;
  • }
  • break;
  • }
  • case WM_CLOSE:// Clic sur la croix de fermeture
  • {
  • // Fermeture de la boite de dialogue:
  • EndDialog(hDlg,0);
  • return 1;
  • }
  • default:
  • break;
  • }
  • return 0;
  • }
  • /******************************************************************/
  • /***************** Fonction WinMain *****************************/
  • int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
  • {
  • // Allouer de la mémoire pour notre dialog template:
  • LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512);
  • // Quitter si échec d'allocation:
  • if (!lpdt) return 1;
  • // Définir les propriétés de la boite de dialogue:
  • lpdt->style = DS_CENTER | WS_POPUP | WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION;
  • lpdt->x = lpdt->y = 0; lpdt->cx = 213; lpdt->cy = 116;
  • // Lancer la boite de dialogue
  • DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)DialogProc);
  • // Libération de la mémoire allouée:
  • GlobalFree((HGLOBAL)lpdt);
  • // Sortie du programme:
  • return 0;
  • }
  • /******************************************************************/
#include <windows.h>
#include <shlobj.h>
#include <commdlg.h>

/********************* Fonction de création des raccourcis ********************/
int Raccourci(HWND parent,BOOL* emplacement,char* name,char* description,char* group,char* path)
{ 
	// Variable contenant le nombre de raccourcis créés:
	int nombre=0;
	// Créer un buffer pour recevoir le chemin d'un dossier spécial:
	char buffer[MAX_PATH];
	// Mettre les identificateurs des dossiers spéciaux dans un tableau:
	int destination[3];
	destination[0]=CSIDL_DESKTOP;
	destination[1]=CSIDL_STARTMENU;
	destination[2]=CSIDL_PROGRAMS;
	// Si aucun emplacement n'est choisi alors retour:
	if(!emplacement[0] && !emplacement[1] && !emplacement[2]) return 0;
	//Vérifier si le chemin ou le fichier est trouvable:
	if (GetFileAttributes(path)== -1)
		{
			MessageBox(parent,"Chemin ou fichier introuvable!","Créateur De Raccourcis",0);
			return 0;
		}
	// Initialiser la librairie COM pour notre programme:
	CoInitialize(NULL);
	// Déclarer un pointeur sur  IShellLink:
    IShellLink* psl;
	// Créer une instance de l'interface IShellLink:
    HRESULT res = CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID *)&psl);
	//Si instance créées avec succès:
    if (SUCCEEDED(res))
	{
		// Déclarer un pointeur sur IPersistFile:
		IPersistFile* ppf;
		// Obtenir une interface IPersistFile:
        psl->QueryInterface(IID_IPersistFile,(LPVOID *)&ppf);
		// Ajout des raccourcis:
		for (int i=0;i<3;i++)
		{
		// Si emplacement non choisi alors aller au suivant:
		if (!emplacement[i]) continue;
		// Obtenir le chemin du dosier spécial en cours:
		SHGetSpecialFolderPath(0,buffer,destination[i],0);
		strcat(buffer,"\\");
		// Créer le groupe si son nom est spécifié:
		if (i && strlen(group))
			{
			// Ajouter le nom du groupe au chemin:
			strcat(buffer,group);
			strcat(buffer,"\\");
			// Créer le goupe:
			CreateDirectory(buffer,0);	
			}
		// Former le chemin complet de l'emplacement du raccourci:
		strcat(buffer,name);
		strcat(buffer,".lnk");
		// Vérifier si le raccourci n'existe déjà:
		if (GetFileAttributes(buffer)!= -1)
		{
			char existe[325];
			strcpy(existe,"Le raccourci suivant existe déjà:\n");
			strcat(existe,buffer);
			strcat(existe,"\nVoulez-vous le remplacer?");
			int choix=MessageBox(parent,existe,"Createur De Raccourcis",MB_YESNO);
			if (choix==IDNO) continue;
		}
		// Définir le chemin du raccourci:
        psl->SetPath(path);
		// Définir la description:
        psl->SetDescription(description);			
		// Convertir le chemin en UNICODE:
		WORD chaine[MAX_PATH];
        MultiByteToWideChar(CP_ACP, 0,buffer, -1,(LPWSTR)chaine, MAX_PATH);
		// Créer le raccourci:
		ppf->Save((LPWSTR)chaine, 1);
		// Incrémenter le compteur de raccourcis créés:
		nombre++;
		}
		// Libérer l'interface IPersistFile:
		ppf->Release();
	}
	// Libérer l'interface IShellLink:
	psl->Release();
	// Fermer la librairie COM:
	CoUninitialize();
	// Former une chaine à partir du compteur pour l'afficher dans un MessageBox:
	char str[30];
	itoa(nombre,str,10);
	strcat(str," raccourci(s) créé(s) avec succès!");
	MessageBox(parent,str,"Créateur De Raccourcis",0);
	// Retourner le nombre de raccourcis créés:
	return nombre;
}
/********************************************************************/


/**************** Procédure de la boite de dialogue ***************/
BOOL CALLBACK DialogProc(  HWND hDlg, UINT message, WPARAM wParam,LPARAM lParam  )
{
	// Déclaration des variables:
	static HWND hStatic1,hStatic2,hStatic3,hStatic4;
	static HWND hEdit1,hEdit2,hEdit3,hEdit4;
	static HWND hCreer,hQuitter,hParcourir;
	static HWND hCadre,hCheck1,hCheck2,hCheck3;
	static char tampon[MAX_PATH];
	
	switch (message)
	{
	case WM_INITDIALOG:// Initialisation de la boite de dialogue
		{
			// Définir le titre de la boite de dialogue:
			SetWindowText(hDlg,"Créateur De Raccourcis");
			// Créer tous les controles:
			hStatic1=CreateWindowEx(0,"STATIC","Nom : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,27,90,20,hDlg,0,0,0);
			hStatic2=CreateWindowEx(0,"STATIC","Description : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,61,90,20,hDlg,0,0,0);
			hStatic3=CreateWindowEx(0,"STATIC","Groupe : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,95,90,20,hDlg,0,0,0);
			hStatic4=CreateWindowEx(0,"STATIC","Chemin : ",WS_CHILD | WS_VISIBLE | SS_RIGHT,10,129,90,20,hDlg,0,0,0);
			hEdit1=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,25,220,20,hDlg,0,0,0);
			hEdit2=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,59,220,20,hDlg,0,0,0);
			hEdit3=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,93,220,20,hDlg,0,0,0);
			hEdit4=CreateWindowEx(WS_EX_CLIENTEDGE,"EDIT",0,WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL | WS_TABSTOP,105,127,220,20,hDlg,0,0,0);
			hCadre=CreateWindowEx(0,"BUTTON","Emplacement du raccourci :",WS_CHILD | WS_VISIBLE | BS_GROUPBOX,15,160,395,55,hDlg,0,0,0);			
			hCheck1=CreateWindowEx(0,"BUTTON","Bureau",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,25,186,70,20,hDlg,0,0,0);
			hCheck2=CreateWindowEx(0,"BUTTON","Menu Démarrer",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,115,186,125,20,hDlg,0,0,0);
			hCheck3=CreateWindowEx(0,"BUTTON","Menu Programmes",WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX | WS_TABSTOP,260,186,145,20,hDlg,0,0,0);
			hCreer=CreateWindowEx(0,"BUTTON","Créer",WS_CHILD | WS_VISIBLE ,340,23,70,24,hDlg,0,0,0);
			hQuitter=CreateWindowEx(0,"BUTTON","Quitter",WS_CHILD | WS_VISIBLE ,340,74,70,24,hDlg,0,0,0);
			hParcourir=CreateWindowEx(0,"BUTTON","Parcourir",WS_CHILD | WS_VISIBLE ,340,125,70,24,hDlg,0,0,0);
			// Limiter la longueur du contenu des EDITs:
			SendMessage(hEdit1,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
			SendMessage(hEdit2,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
			SendMessage(hEdit3,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
			SendMessage(hEdit4,EM_SETLIMITTEXT,(WPARAM) MAX_PATH,0);
			// Cocher le CheckBox "Bureau":
			SendMessage(hCheck1,BM_SETCHECK,(WPARAM)BST_CHECKED,0);
			// Mettre le focus dans le champ "Nom":
			SetFocus(hEdit1);
			return 0;
		}

	case WM_COMMAND:// Action sur l'un des controles
		{
			// Déterminer l'état des CheckBoxes:
			BOOL bureau=SendMessage(hCheck1,BM_GETCHECK,0,0)==BST_CHECKED;
			BOOL demarrer=SendMessage(hCheck2,BM_GETCHECK,0,0)==BST_CHECKED;
			BOOL programmes=SendMessage(hCheck3,BM_GETCHECK,0,0)==BST_CHECKED;
			// Griser les champs ou les boutons selon l'état des CheckBoxes:
			BOOL state=bureau || demarrer || programmes;
			EnableWindow(hEdit1,state);
			EnableWindow(hStatic1,state);
			EnableWindow(hEdit2,state);
			EnableWindow(hStatic2,state);
			EnableWindow(hEdit3,demarrer || programmes);
			EnableWindow(hStatic3,demarrer || programmes);
			EnableWindow(hEdit4,state);
			EnableWindow(hStatic4,state);
			EnableWindow(hParcourir,state);
			// Griser le bouton "Créer" si "Nom" et "Chemin" sont vides ou les CheckBoxes décochés:
			GetWindowText(hEdit1,tampon,sizeof(tampon));
			int lennom=strlen(tampon);
			GetWindowText(hEdit4,tampon,sizeof(tampon));
			int lenchemin=strlen(tampon);
			EnableWindow(hCreer,lennom && lenchemin>=2 && (state));
			
			// Clic sur le bouton "Créer":
			if( (HWND)lParam == hCreer)   
			{
				// Passer le contenu des champs dans des variables:
				char nom[MAX_PATH];
				GetWindowText(hEdit1,nom,MAX_PATH);
				char description[MAX_PATH];
				GetWindowText(hEdit2,description,MAX_PATH);
				char groupe[MAX_PATH];
				GetWindowText(hEdit3,groupe,MAX_PATH);
				char chemin[MAX_PATH];
				GetWindowText(hEdit4,chemin,MAX_PATH);
				// Passer l'etat des CheckBoxes dans un tableau;
				BOOL etat[3]; etat[0]=bureau; etat[1]=demarrer; etat[2]=programmes;
				// Appeler la fonction de création de raccourcis:
				int nbr=Raccourci(hDlg,etat,nom,description,groupe,chemin);
				// Si succès effacer les champs:
				if (nbr)
				{
				SetWindowText(hEdit1,0);
				SetWindowText(hEdit2,0);
				SetWindowText(hEdit3,0);
				SetWindowText(hEdit4,0);
				}
				// Mettre le focus dans le champ "Nom":
				SetFocus(hEdit1);
				break;
			}
			
			// Clic sur le bouton "Parcourir":
			if( (HWND)lParam == hParcourir)   
			{
			// Déclarer une structure OPENFILENAME:
			OPENFILENAME ofn;
			// Mettre tous les membres de la structure à 0:
			memset( &ofn, 0, sizeof(OPENFILENAME) ); 
			// Définir les membres:
			ofn.lStructSize = sizeof(OPENFILENAME); 
		    ofn.hwndOwner = hDlg;
			ofn.lpstrFilter = "Tous les fichiers\0*.*\0\0";
			strcpy(tampon,"*.*");
			ofn.lpstrFile = tampon;
			ofn.nMaxFile = MAX_PATH;
			ofn.lpstrTitle = "Choisir un fichier";
			ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
			// Lancer la boite de dialogue pour choisir un fichier:
			if (GetOpenFileName(&ofn))SetWindowText(hEdit4,tampon);
			// Mettre le focus dans le champ "Chemin":
			SetFocus(hEdit4);
			break;
			}
			
			// Clic sur le bouton "Quitter":
			if( (HWND)lParam == hQuitter)   
			{
			// Fermeture de la boite de dialogue:
			EndDialog(hDlg,0);
			return 1;
			}

			break;
		}

	case WM_CLOSE:// Clic sur la croix de fermeture
		{
			// Fermeture de la boite de dialogue:
			EndDialog(hDlg,0);
			return 1;
		}

	default:
		break;
	}
	return 0;
}
/******************************************************************/


/*****************  Fonction WinMain  *****************************/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{  
	// Allouer de la mémoire pour notre dialog template:
    LPDLGTEMPLATE lpdt = ( LPDLGTEMPLATE) GlobalAlloc(GPTR, 512); 
	// Quitter si échec d'allocation:	
    if (!lpdt) return 1; 
    // Définir les propriétés de la boite de dialogue:
    lpdt->style = DS_CENTER | WS_POPUP | WS_MINIMIZEBOX| WS_SYSMENU | DS_MODALFRAME | WS_CAPTION; 
    lpdt->x = lpdt->y  = 0;  lpdt->cx = 213; lpdt->cy = 116; 	
    // Lancer la boite de dialogue
    DialogBoxIndirect(hInstance,lpdt,NULL,(DLGPROC)DialogProc);
	// Libération de la mémoire allouée:
    GlobalFree((HGLOBAL)lpdt); 
	// Sortie du programme:
	return 0;
}
/******************************************************************/


 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Sources du même auteur

Source avec Zip Source avec une capture SOUS-CLASSEMENT DE FENÊTRE D'UN AUTRE PROCESS PAR INJECTION ...
Source avec Zip Source avec une capture FENÊTRE FLOTTANTE SANS FOCUS (WIN32 API)
Source avec Zip Source avec une capture SERVICE WINDOWS DANS UNE DLL LANCÉ PAR SVCHOST.EXE
Source avec Zip Source avec une capture IMPRESSION EN WIN32 API AVEC OPTIONS
Source avec Zip Source avec une capture INFOTIP SHELL EXTENSION (BULLE DE L'EXPLORATEUR WINDOWS) (WI...

 Sources de la même categorie

Source avec Zip WIN32 TLS LENT par dguilmain
Source avec Zip VIDER ELEMENTS DE CORBEILLE WINDOWS7 (WIN64) par BruNews
Source avec Zip Source avec une capture FIND TEXT (WIN64) par BruNews
Source avec Zip DELETE DIRECTORY (WIN64) par BruNews
Source avec Zip ENUM DIRECTORY (WIN64) par BruNews

Commentaires et avis

Commentaire de magic_Nono le 18/12/2004 09:00:20

Bon prog

++
Nono.

Commentaire de AlexMAN le 18/12/2004 09:15:09

Bonjour,

D'abord merci pour ton prog, car c bien utile d'avoir un ptit programme comme ca !
Ensuite, j'ai une kestion :
Dans tous tes progs, tu crées des dialogs 'dynamikement', a partir de ton propre TEMPLATE, ya til une raison ou alors est ce que c juste une habitude ?

Voila, merci beaucoup

A bientot

+2(p-n)

Commentaire de gagah1 le 18/12/2004 11:19:58

Salut!
J'ai pas encore regardé les codes mais déjà je te remercie beaucoup.

Commentaire de racpp le 18/12/2004 13:51:45 administrateur CS

Salut,
Merci pour les commentaires.
AlexMAN > Je préfère céer mes boites de dialogues dynamiquement car je n'aime pas l'éditeur de ressources. Je préfère tout mettre dans le code tant que possible. Ca me permet de le mieux maitriser. Puisque j'utilise beaucoup les boites de dialogues, je trouve plus pratique de copier/coller la portion de création de la boite que d'être obligé d'ajouter à chaque fois une nouvelle ressource. Avec la méthode dynamique, on peut définir la position et les dimensions de la boite avant sa création. Ce ne sont que des exemples d'avantages car il y'en a d'autres comme la précision, la réutilisation du code, la portabilité pour les compilateurs Windows etc...

Commentaire de XCat le 19/12/2004 11:46:27

cool ton prog

Commentaire de Nebula le 20/12/2004 02:37:58

Excellente source (et en C, de plus), mais j'ai eu du mal à la faire fonctionner !

Tout d'abord, j'ai fait face à des erreurs de ce type :
main.c(74) : error C2039: 'QueryInterface' : is not a member of 'IShellLinkA'
        C:\Program Files\Microsoft SDK\include\ShObjIdl.h(5239) : see declaration of 'IShellLinkA'
main.c(75) : error C2039: 'SetPath' : is not a member of 'IShellLinkA'
        C:\Program Files\Microsoft SDK\include\ShObjIdl.h(5239) : see declaration of 'IShellLinkA'
main.c(78) : error C2039: 'Save' : is not a member of 'IPersistFile'
        C:\Program Files\Microsoft SDK\include\ObjIdl.h(5492) : see declaration of 'IPersistFile'
main.c(79) : error C2039: 'Release' : is not a member of 'IPersistFile'
        C:\Program Files\Microsoft SDK\include\ObjIdl.h(5492) : see declaration of 'IPersistFile'
main.c(88) : error C2039: 'Release' : is not a member of 'IShellLinkA'
        C:\Program Files\Microsoft SDK\include\ShObjIdl.h(5239) : see declaration of 'IShellLinkA'

Que j'ai résolu après examen du .h incriminé, en modifiant les lignes pour utiliser la structure de l'interface, ainsi (iSL était mon IShellLink* et iPF le iPersistFile*) :
    iSL->QueryInterface(IID_IPersistFile, &iPF);
    iSL->SetPath(szName);
    iSL->SetDescription(szDesc);
    iSL->SetIconLocation(szName, 0);
Est devenu (il a fallu ajouter un & devant IID_IPersistFile et les autres IID_*, j'ignore pourquoi) :
    iSL->lpVtbl->QueryInterface(iSL, &IID_IPersistFile, &iPF);
    iSL->lpVtbl->SetPath(iSL, szName);
    iSL->lpVtbl->SetDescription(iSL, szDesc);
    iSL->lpVtbl->SetIconLocation(iSL, szName, 0);

Ensuite la compilation s'est (enfin !) bien déroulée, hormis quelques warnings et une erreur...
Sous MSVC: main.obj : error LNK2001: unresolved external symbol _IID_IPersistFile
et avec GCC: main.c:74: undefined reference to `IID_IPersistFile'

Bon après petite recherche dans les lib, il fallait linker avec uuid.lib ou libuuid.a (selon le compilo). Ce n'est pas le plus grave, j'aimerais juste savoir comment il se fait que j'aie du passer par la structure de l'interface pour compiler, aussi bien dans MSVC que MinGW ? J'ai compilé les deux en mode C "pur", et les exemples de la MSDN sont un coup avec l'interface "normale" et un coup avec l'utilisation de la structure interne, ce qui me laisse perplexe. Il y a aussi cette histoire de "&" devant les constantes IID_* :-/

Pour mon premier contact avec les interfaces, je trouve çà un peu chi*nt... Faut être obstiné, lol

Commentaire de racpp le 20/12/2004 16:53:57 administrateur CS

Salut,
Nebula > Quand j'ai commencé à faire ce source, je n'avais pas l'intention de le faire en C pur. Je n'ai donc rien changé aux options de mon compilateur (Visual C/C++ 6). D'après ces messages d'erreurs, il me semble que le compilateur doit être en mode C++. Toutes ces interfaces sont définies dans "comdef.h". Dans l'en-tête   de ce fichier on peut lire:"Native C++ compiler COM support" puis un peu plus bas :
#ifndef  __cplusplus
#error Native Compiler support only available in C++ compiler
#endif
Je pense que cela explique ces erreurs. En C++, tu n'auras sûrement auncun problème de compilation. Bonne chance.

Commentaire de Nebula le 20/12/2004 18:24:31

D'accord, ceci explique cela. Mais les manipulations que j'ai exposées permettent une compilation en C pur, et fonctionnent à merveille (pas testé en mode C++, je ne l'utilise pour ainsi dire jamais). Encore merci pour cette source très utile !

Commentaire de cosmobob le 23/02/2005 14:22:29

salut,
juste pour te dire que t'as pas fait attention ici:
   char str[30];
    itoa(nombre,str,10);
    strcat(str," raccourci(s) créé(s) avec succès!");
(a la fin de la fonction raccourci)
et que du coup il y a un buffer overflow.
meme si on s'en rend pas bien compte, " raccourci(s) créé(s) avec succès!" fait plus que 30 caracteres.
Comme quoi mieux vaut TOUJOURS utiliser strncpy à la place de strcpy. Tu aurais vu à l'execution le message tronqué, et t'aurais compris que la taille du buffer etait trop petite.
Pis pareil, le prototype de raccourci devrait plutot etre:
int Raccourci(HWND parent, const BOOL* emplacement, const char* name, const char* description, const char* group, const char* path)
vu que ce qui est pointé par tes parametres n'a pas vocation a etre modifié. prendre l'habitude la coute rien et permet d'eviter certains plantages des la compilation.
a+

Commentaire de cosmobob le 23/02/2005 14:30:07

en l'occurence c'etait strncat qu'il eut fallu utiliser et pas strncpy ;) enfin bon, quoi qu'il arrive, mieux vaut remplacer strcpy et strcat par leurs versions avec controle de la taille de buffer, à savoir strncpy et strncat. ces erreurs la sont les plus chiantes a déboguer....
sinon, ta source est tres bien, bravo!

a++ ;)

Commentaire de BruNews le 21/03/2005 19:12:46 administrateur CS

Avec un peu de retard de ma part, bonne source.

Commentaire de racpp le 22/03/2005 20:01:02 administrateur CS

BruNews  > Merci, j'espère que "erreur 500" ne m'empechera plus de répondre aux commentaires.

cosmobob > Merci pour les remarques. En effet, lorsqu'on focalise sur le noyau d'un programme on ne fait pas très attention au reste, surtout quand on manque de temps.
A propos de la première remarque, j'avais fait "char str[30]" car le message à concaténer était " raccourci(s) créé(s)!", ce qui fait un total de 23 caractères seulement. Mais, après avoir ajouté "avec succès", j'ai oublié d'augmenter la taille du tableau str. Ca n'a pourtant pas empêché le message de s'afficher correctement (non tronqué chez moi). Si sa taille est 40 par exemple, on n'aura jamais de buffer overflow. La fonction strncat() est inutile ici puisque la taille de la chaine à concaténer est fixe. Cette fonction  ne sert qu'à limiter le nombre de caractères à concaténer.
Pour la deuxième remarque, je n'ai jamais eu de plantages causés par l'absence de "const" dans le prototype de fonctions. Mais c'est bon à savoir. Merci pour le conseil.

Commentaire de supergrey le 02/06/2010 18:30:30

Salut, merci pour la source, je viens d'essayer et le raccourcis ne pointe sur rien, voila ma fonction:

void Raccourci(char* name,char* description,char* path)
{
// Créer un buffer pour recevoir le chemin d'un dossier spécial:
char buffer[MAX_PATH];


// Initialiser la librairie COM pour notre programme:
CoInitialize(NULL);
// Déclarer un pointeur sur IShellLink:
IShellLink* psl;
// Créer une instance de l'interface IShellLink:
HRESULT res = CoCreateInstance(CLSID_ShellLink,0,CLSCTX_INPROC_SERVER,IID_IShellLink,(LPVOID *)&psl);
//Si instance créées avec succès:
if (SUCCEEDED(res))
{
// Déclarer un pointeur sur IPersistFile:
IPersistFile* ppf;
// Obtenir une interface IPersistFile:
psl->QueryInterface(IID_IPersistFile,(LPVOID *)&ppf);
// Ajout des raccourcis:

// Obtenir le chemin du dosier spécial en cours:
SHGetSpecialFolderPath(0,buffer,CSIDL_DESKTOP,0);
strcat(buffer,"\\");

// Former le chemin complet de l'emplacement du raccourci:
strcat(buffer,name);
strcat(buffer,".lnk");

// Définir le chemin du raccourci:
psl->SetPath(path);
// Définir la description:
psl->SetDescription(description);
// Convertir le chemin en UNICODE:
WORD chaine[MAX_PATH];
MultiByteToWideChar(CP_ACP, 0,buffer, -1,(LPWSTR)chaine, MAX_PATH);
// Créer le raccourci:
ppf->Save((LPWSTR)chaine, 1);
// Incrémenter le compteur de raccourcis créés:

// Libérer l'interface IPersistFile:
ppf->Release();
}

psl->Release();

CoUninitialize();
}

Commentaire de supergrey le 03/06/2010 10:34:13

Pour info je suis sous windows 7 64, je ne trouve pas le problème...

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,718 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales