FAQ VC++ et MFCConsultez toutes les FAQ
Nombre d'auteurs : 20, nombre de questions : 545, dernière mise à jour : 5 avril 2013 Ajouter une question
Cette faq a été réalisée pour répondre aux questions les plus fréquement posées sur le forum Développement Visual C++
Je tiens à souligner que cette faq ne garantit en aucun cas que les informations qu'elle contient sont correctes ; Les auteurs font le maximum, mais l'erreur est humaine. Si vous trouvez une erreur, ou si vous souhaitez devenir redacteur, lisez ceci.
Sur ce, je vous souhaite une bonne lecture. Farscape
- Comment lancer une application correspondant à une extension de fichier?
- Comment lancer l'impression d'un document Word ou Excel ?
- Comment lancer un programme externe, Word par exemple ?
- Comment associer un programme à une extension de fichier?
- Comment associer une icône à une extension de fichier ?
- Comment déterminer le système d'exploitation ?
- Comment récupérer le code utilisateur en cours ?
Avec la fonction ShellExecute :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 | HINSTANCE ShellExecute( HWND hwnd, LPCTSTR lpOperation, LPCTSTR lpFile, LPCTSTR lpParameters, LPCTSTR lpDirectory, INT nShowCmd ); |
- " edit " : Lance l'éditeur et ouvre le document pour modification ,si lpFile n'est pas un document valide la fonction échoue.
- "explore": Lance l'exploration du dossier spécifié par lpFile.
- "find": Lance une recherche qui démarre à partir du répertoire spécifié.
- "open": Ouvre le fichier spécifié par le paramètre lpFile ,le fichier peut être un fichier exécutable, un document ou un répertoire.
- "print": Imprime le document spécifié par lpFile, si lpFile n'est pas un document valide le traitement échoue.
Lpfile :
Une chaîne de caractères terminée par un ‘\0' correspondant au paramètre s'appliquant au mode spécifié par lpOperation.
lpParameters :
Si le paramètre lpFile est un fichier exécutable lpParameters devra contenir sous forme d'une chaîne de caractères le paramètre passé à l'application.
Si lpFile correspond à un document lpParameters doit être NULL.
lpDirectory:
Un pointeur sur une chaîne de caractères se terminant par un ‘\0' pour spécifier le répertoire par défaut.
nShowCmd :
Correspond au mode d'affichage de l'application lancée.
- SW_HIDE : Rend la fenêtre invisible
- SW_MINIMIZE : Minimise la fenêtre et active la première fenêtre de la liste système
- SW_RESTORE : Active et affiche la fenêtre si celle-ci est maximisée ou minimisée elle est restaurée à sa taille et position d'origine
- SW_SHOW : Active et affiche la fenêtre à sa taille et position courante
- SW_SHOWMAXIMIZED : Active la fenêtre et l'affiche à sa taille maximale
- SW_SHOWMINIMIZED : Active la fenêtre et l'affiche sous forme d'icône
- SW_SHOWNORMAL : Est synonyme de SW_RESTORE
La fonction retourne un «Handle» supérieur à 32 si la commande a réussi sinon inférieur à 32 signifie une erreur.
Voir Documentation MSDN pour les codes d'erreurs.
Formats d'utilisations:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | //Ouvrir un répertoire: ShellExecute(handle, NULL, path_to_folder, NULL, NULL, SW_SHOWNORMAL); //ou ShellExecute(handle, "open", path_to_folder, NULL, NULL, SW_SHOWNORMAL); //Explorer un répertoire ShellExecute(handle, "explore", path_to_folder, NULL, NULL, SW_SHOWNORMAL); //Lancer une recherche: ShellExecute(handle, "find", path_to_folder, NULL, NULL, 0); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | HINSTANCE nerror; CString strOutputName= "mondocument.doc"; if((nerror=ShellExecute(AfxGetMainWnd()->m_hWnd, "open", strOutputName, NULL, NULL, SW_SHOWNORMAL))<=(HINSTANCE)32) { CString mess; mess.Format("Impossible de Modifier ou d'Ouvrir le Document:\n%s Erreur n°:%d", strOutputName,nerror); AfxMessageBox(mess,MB_ICONEXCLAMATION); } |
Le code qui suit est différent car il attend que le processus d'impression soit terminé.
On utilisera cette fois ShellExecuteEx:
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 | BOOL ShellExecuteEx( LPSHELLEXECUTEINFO lpExecInfo ); Voir documentation MSDN pour le détail de la structure SHELLEXECUTEINFO. |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 | SHELLEXECUTEINFO sei; ZeroMemory(&sei, sizeof(SHELLEXECUTEINFO)); sei.cbSize = sizeof(SHELLEXECUTEINFO ); sei.lpFile = “mondocument.doc”; sei.fMask = SEE_MASK_NOCLOSEPROCESS; sei.lpVerb = TEXT("print"); sei.nShow = SW_SHOWNORMAL; if(ShellExecuteEx(&sei)) { WaitForSingleObject(sei.hProcess, INFINITE); } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | HINSTANCE nerror; CString strApp="WINWORD"; nerror=ShellExecute(AfxGetMainWnd()->m_hWnd, NULL, strApp, NULL, NULL, SW_SHOWNORMAL); if(reinterpret_cast<int>(nerror) <= 32) { CString mess; mess.Format("Erreur de lancement de l'application:\n%s Erreur n°:%d", (const char *)strApp,nerror); AfxMessageBox(mess,MB_ICONEXCLAMATION); } |
En inscrivant directement la valeur dans la base de registre
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | bool SetRunAppWithExtension(const char *szAppName, const char *szLibApp, const char *szCommandLine, const char *szExtName) { HKEY hKey=NULL; long ret; // Creation de la racine szAppName if(RegCreateKey(HKEY_CLASSES_ROOT, szAppName, &hKey)!=ERROR_SUCCESS) return false; if(RegSetValue(hKey, "", REG_SZ,szLibApp, NULL)!=ERROR_SUCCESS) { RegCloseKey(hKey); return false; } RegCloseKey(hKey); // création de l'entrée pour l'extension szExtname associée à szAppName if((ret=RegCreateKey(HKEY_CLASSES_ROOT, szExtName,&hKey))==ERROR_SUCCESS) ret=RegSetValue(hKey, "", REG_SZ, szAppName,NULL); else { RegCloseKey(hKey); return false; } RegCloseKey(hKey); // fixe la ligne de commande pour szAppName if((ret = RegCreateKey(HKEY_CLASSES_ROOT, szAppName,&hKey))==ERROR_SUCCESS) ret = RegSetValue(hKey, "shell\\open\\command", REG_SZ, szCommandLine, MAX_PATH); if(ret==ERROR_SUCCESS) RegCloseKey(hKey); return (ret==ERROR_SUCCESS); } |
Code c++ : | Sélectionner tout |
1 2 | SetRunAppWithExtension ("MyDump", "Dump Fichiers Perso","C:\\Projects\\MyDump.exe %1",".prs"); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | bool SetIconApp(const char *szAppName,const char *szPathIcon) { HKEY hKey=NULL; long ret; // Création de la racine szAppName if(RegCreateKey(HKEY_CLASSES_ROOT, szAppName, &hKey)!=ERROR_SUCCESS) return false; ret = RegSetValue(hKey, "DefaultIcon", REG_SZ,szPathIcon,MAX_PATH); if(ret==ERROR_SUCCESS) RegCloseKey(hKey); return (ret==ERROR_SUCCESS); } |
Code c++ : | Sélectionner tout |
1 2 | SetIconApp ("MyDump","C:\\Projects\\MyDump.ico"); |
la fonction ci dessous renvoie les codes suivants:
- -1 : erreur
- 01:WIN95
- 02:WIN98
- 03:WINNT
- 04:WINXP
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | int GetOSystem() { OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) { // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO. osvi.dwOSVersionInfoSize = sizeof (OSVERSIONINFO); if (! GetVersionEx ( (OSVERSIONINFO *) &osvi) ) return -1; } if(osvi.dwPlatformId==VER_PLATFORM_WIN32_NT) { if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) return 4; return 3; } if(osvi.dwPlatformId==VER_PLATFORM_WIN32s) return 0; if(osvi.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS) { if(osvi.dwMinorVersion==0) return 1; else if(osvi.dwMinorVersion>0) return 2; } return -1; } |
Plusieurs techniques possibles :
- la base de registre ;
- la fonction WNetGetUser ;
- la fonction GetUserName.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | //------------------------------------------------------------------------ #define MAXESC 255 int GetRegistryLocalMachine( const char* szkey, const char* szname, void* pval ) { int nError; unsigned long sz = MAXESC; DWORD tp; HKEY k; char *szVal=(char *)pval; if (nError = RegOpenKeyEx( HKEY_LOCAL_MACHINE, szkey, 0, KEY_ALL_ACCESS, &k ) ) return nError; if (nError = RegQueryValueEx( k, szname, 0, &tp, (LPBYTE)pval, &sz ) ) return nError; if (szVal [sz-1] != 0 ) szVal [sz] = 0; if (nError = RegCloseKey( k ) ) return nError; return 0; } CString GetCurrentUser() { DWORD nlen=20; char szUser[20]; if(GetRegistryLocalMachine( "System\\CurrentControlSet\\Control", "Current User",szUser)) { WNetGetUser(NULL,szUser,&nlen); } return szUser; } // dernière méthode char user[100]; DWORD size = 100; GetUserName(user,&size); |
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.