Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

Vous n'avez pas encore de compte Developpez.com ? L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

Developpez.com

C++

Choisissez la catégorie, puis la rubrique :

logo
Sommaire > Base de Registre
        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 ?



Comment lancer une application correspondant à une extension de fichier?
Mise à jour le 20/05/2006[haut]
auteur : Farscape
Avec la fonction ShellExecute :

HINSTANCE ShellExecute(
    HWND hwnd, 
    LPCTSTR lpOperation,
    LPCTSTR lpFile, 
    LPCTSTR lpParameters, 
    LPCTSTR lpDirectory,
    INT nShowCmd
);
Voici les commandes possibles pour lporeration :

  • " 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:

//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);
Exemple ouverture d'un fichier « .doc »

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);
    }

Comment lancer l'impression d'un document Word ou Excel ?
auteur : Farscape
Le code qui suit est différent car il attend que le processus d'impression soit terminé.
On utilisera cette fois ShellExecuteEx:

BOOL ShellExecuteEx(
    LPSHELLEXECUTEINFO lpExecInfo
);

Voir documentation MSDN pour le détail de la structure SHELLEXECUTEINFO.

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);
}

Comment lancer un programme externe, Word par exemple ?
auteur : Farscape

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);
}

Comment associer un programme à une extension de fichier?
auteur : Farscape
En inscrivant directement la valeur dans la base de registre

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);
}
exemple d'utilisation :

SetRunAppWithExtension ("MyDump", "Dump Fichiers Perso","C:\\Projects\\MyDump.exe %1",".prs");
Association pour le programme MyDump.exe à l'extension de fichier « .prs ».


Comment associer une icône à une extension de fichier ?
auteur : Farscape

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);
}
exemple d'utilisation :

SetIconApp ("MyDump","C:\\Projects\\MyDump.ico"); 

Comment déterminer le système d'exploitation ?
auteur : Farscape
la fonction ci dessous renvoie les codes suivants:

  • -1 : erreur
  • 01:WIN95
  • 02:WIN98
  • 03:WINNT
  • 04:WINXP

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; 
} 

Comment récupérer le code utilisateur en cours ?
auteur : Farscape
Plusieurs techniques possibles :

  • la base de registre ;
  • la fonction WNetGetUser ;
  • la fonction GetUserName.

//------------------------------------------------------------------------
#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);


Consultez les autres F.A.Q.


Valid XHTML 1.0 TransitionalValid CSS!

Les 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 © 2004 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site ni 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.

Contacter le responsable de la rubrique C++

Partenaire : Hébergement Web