IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MFC Discussion :

[MFC] Créer un ShortCut sur le bureau


Sujet :

MFC

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut [MFC] Créer un ShortCut sur le bureau
    Bonjour,

    Je cherche à créer un ShortCut sur le bureau dans une appli dialog based......
    J'ai cherché dans le MSDN mais je n'ai pas trouvé de fonctions en C++.

    Je vous remercie d'avance.
    Cheper

  2. #2
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, regarde cette classe ici marche tres bien http://www.codeproject.com/shell/CShortcut.asp?df=100

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Tout d'abord merci

    j'ai téléchargé les sources, que j'ai inclu dans mon code....Le seul problème est le suivant :

    En compilant le code 2 erreurs sont apparu (en fait 4 mais c'est deux fois les meme) :

    c:\Documents and Settings\Tom\Bureau\Vivien\Setup_CIP\Shortcut.cpp(135) : error C2664: 'MultiByteToWideChar' : impossible de convertir le paramètre 5 de 'WORD [260]' en 'LPWSTR'
    Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
    c:\Documents and Settings\Tom\Bureau\Vivien\Setup_CIP\Shortcut.cpp(148) : error C2664: 'IPersistFile::Save' : impossible de convertir le paramètre 1 de 'WORD [260]' en 'LPCOLESTR'
    Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction
    Ces fonctions : MultiByteToWideChar et IPersistFile::Save sont des fonctions fourni dans le .cpp que j'ai téléchargé.

    Je n'ose pas trop y toucher de peur de tous foutre en l'air, puis je ne sais pas ce que veux dire 'LPCOLESTR'...

    Si tu peux m'aider je t'en serai très reconnaissant.
    Merci d'avance.

    Cheper

  4. #4
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    il semblerait que tu sois en unicode, n'est-ce pas ?

    sinon, je t'ai refait une version simplifiée de la création de raccourci (ce qu'il y a dans le lien étant plus complet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    #include <windows.h>
    #include <shlobj.h>
     
    int CreerRacourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination)
    {
    	HRESULT hr;
    	CoInitialize(NULL);
        BOOL bRet = FALSE;
        IShellLink* psl;
        if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl)))
        {
            IPersistFile* ppf;
            psl->SetPath(pathExe);
            psl->SetDescription(description);
    		psl->SetArguments(argument);
            if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf)))
    		{
    			WORD wsz[MAX_PATH];
    			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, destination, -1, wsz, MAX_PATH);
    			hr = psl->SetIconLocation(iconePath, iconeIndex);	
    			if(SUCCEEDED(ppf->Save(wsz, TRUE)))
    				bRet = TRUE;
    			ppf->Release();
    		}
            psl->Release();
    	} 
    	return bRet;
    }
     
     
    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	CreerRacourci("c:\\install.exe","l'installation","","c:\\monexe.exe",0,"c:\\mon raccourci.lnk");
    	return TRUE;
    }

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Désolé mais ca me donne les memes erreurs....

    Et juste une question à part : c'est quoi être en unicode???

  6. #6
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    l'unicode c'est en gros une facon de représenter en mémoire une chaine de caractère.
    Normal : 1 octet pour un caractère
    Unicode : 2 octets

    essaie de retirer la conversion avec MultiByteToWideChar, elle n'a plus d'utilité dans ce cas

  7. #7
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    tiens, je t'ai fait une version avec conversion pour l'unicode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    #include <windows.h>
    #include <shlobj.h>
     
    #ifndef UNICODE
    int CreerRaccourciA(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination)
    {
    	HRESULT hr;
    	CoInitialize(NULL);
        BOOL bRet = FALSE;
        IShellLink* psl;
        if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl)))
        {
            IPersistFile* ppf;
            psl->SetPath(pathExe);
            psl->SetDescription(description);
    		psl->SetArguments(argument);
            if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf)))
    		{
    			WORD wsz[MAX_PATH];
    			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, destination, -1, wsz, MAX_PATH);
    			hr = psl->SetIconLocation(iconePath, iconeIndex);	
    			if(SUCCEEDED(ppf->Save(wsz, TRUE)))
    				bRet = TRUE;
    			ppf->Release();
    		}
            psl->Release();
    	} 
    	return bRet;
    }
    #endif
     
    #ifdef UNICODE
    int CreerRaccourciW(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination)
    {
    	HRESULT hr;
    	CoInitialize(NULL);
    	BOOL bRet = FALSE;
    	IShellLink* psl;
    	if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl)))
    	{
    		IPersistFile* ppf;
    		wchar_t * WpathExe, *Wdescription, *Wargument, *WiconePath;
    		int taille;
    		taille = strlen(pathExe)+1;
    		WpathExe = new wchar_t[taille];
    		mbstowcs( WpathExe, pathExe, taille);
    		WpathExe[taille-1] = L'\0';
    		psl->SetPath(WpathExe);
    		taille = strlen(description)+1;
    		Wdescription = new wchar_t[taille];
    		mbstowcs( Wdescription, description, taille);
    		Wdescription[taille-1] = L'\0';
    		psl->SetDescription(Wdescription);
    		taille = strlen(argument)+1;
    		Wargument = new wchar_t[taille];
    		mbstowcs( Wargument, argument, taille);
    		Wargument[taille-1] = L'\0';
    		psl->SetArguments(Wargument);
    		if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf)))
    		{
    			WORD wsz[MAX_PATH];
    			MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, destination, -1, wsz, MAX_PATH);
    			taille = strlen(iconePath)+1;
    			WiconePath = new wchar_t[taille];
    			mbstowcs( WiconePath, iconePath, taille);
    			hr = psl->SetIconLocation(WiconePath, iconeIndex);	
    			if(SUCCEEDED(ppf->Save(wsz, TRUE)))
    				bRet = TRUE;
    			ppf->Release();
    		}
    		psl->Release();
    		delete WpathExe;
    		delete Wdescription;
    		delete Wargument;
    		delete WiconePath;
    	} 
    	return bRet;
    }
    #endif
     
    int CreerRaccourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination)
    {
    #ifdef UNICODE
    	return CreerRaccourciW(pathExe, description, argument, iconePath, iconeIndex, destination);
    #else
    	return CreerRaccourciA(pathExe, description, argument, iconePath, iconeIndex, destination);
    #endif
    }
     
    int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    {
    	if (CreerRaccourci("c:\\install.exe","l'installation","","c:\\monexe.exe",0,"c:\\mon raccourci.lnk"))
    	{
    		// reussi
    	}
    	else
    	{
    		// raté
    	}
    	return TRUE;
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Bonjour,

    Merci beaucoup pour ce code, ca fait plaisir de voir quelqu'un s'occupé de moi comme ca....
    Les deux anciennes erreurs n'apparaissent plus.....mais une nouvelle est apparut : (je ne l'ai jamais vu)

    Setup_CIPDlg.obj : error LNK2019: symbole externe non résolu "protected: int __thiscall CSetup_CIPDlg::CreerRaccourci(char *,char *,char *,char *,int,char *)" (?CreerRaccourci@CSetup_CIPDlg@@IAEHPAD000H0@Z) référencé dans la fonction "public: void __thiscall CSetup_CIPDlg::OnBnClickedOk(void)" (?OnBnClickedOk@CSetup_CIPDlg@@QAEXXZ)
    Je suis désolé de te redemander ca, mais pourrait tu me dire comment y remédier ??

    Un enorme merci d'avance........

  9. #9
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    montre moi la facon dont tu as prototypé la fonction (dans le .h par ex), puis l'appel

    Autre question, tu es toujours dans le contexte d'une appli dialog based ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Je suis toujours dans le cadre d'une appli basée dialogue.....

    Dans le .h :
    protected:
    int CreerRaccourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination);
    Dans le .cpp :
    CreerRaccourci("C:\\sudev\\vivien\\magic8\\MGrntw.exe", "Raccourci vers MGrntw.exe", "", NULL, 0, "C:\\Documents and Settings\\Tom\\Bureau\\C.I.P.lnk");
    Par contre j'ai enlevé le CreerRaccourciA ,il me faisait des erreurs (les memes qu'avant), pour ne garder que CreerRaccourciW que j'ai appelé CreerRaccourci.

  11. #11
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je n'ai aucune idée de ton héritage, mais si tu mets la fonction en public, ca ne résout pas le problème ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Je t'avoue que je ne sais pas pourquoi je l'ai mis en protected.....
    Mais en public ca ne marche toujours pas......
    Je ne sais plus quoi faire (déjà qu'avant je savais pas trop alors imagine maintenant !)

  13. #13
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    et l'implémentation, montre voir le code

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Ca c'est le code de ta fonction CreerRaccourciW :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #ifdef UNICODE 
    int CSetup_CIPDlg::CreerRaccourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination) 
    { 
       HRESULT hr; 
       CoInitialize(NULL); 
       BOOL bRet = FALSE; 
       IShellLink* psl; 
       if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl))) 
       { 
          IPersistFile* ppf; 
          wchar_t * WpathExe, *Wdescription, *Wargument, *WiconePath; 
          int taille; 
          taille = strlen(pathExe)+1; 
          WpathExe = new wchar_t[taille]; 
          mbstowcs( WpathExe, pathExe, taille); 
          WpathExe[taille-1] = L'\0'; 
          psl->SetPath(WpathExe); 
          taille = strlen(description)+1; 
          Wdescription = new wchar_t[taille]; 
          mbstowcs( Wdescription, description, taille); 
          Wdescription[taille-1] = L'\0'; 
          psl->SetDescription(Wdescription); 
          taille = strlen(argument)+1; 
          Wargument = new wchar_t[taille]; 
          mbstowcs( Wargument, argument, taille); 
          Wargument[taille-1] = L'\0'; 
          psl->SetArguments(Wargument); 
          if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf))) 
          { 
             WORD wsz[MAX_PATH]; 
             MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, destination, -1, wsz, MAX_PATH); 
             taille = strlen(iconePath)+1; 
             WiconePath = new wchar_t[taille]; 
             mbstowcs( WiconePath, iconePath, taille); 
             hr = psl->SetIconLocation(WiconePath, iconeIndex);    
             if(SUCCEEDED(ppf->Save(wsz, TRUE))) 
                bRet = TRUE; 
             ppf->Release(); 
          } 
          psl->Release(); 
          delete WpathExe; 
          delete Wdescription; 
          delete Wargument; 
          delete WiconePath; 
       } 
       return bRet; 
    } 
    #endif
    Ca c'est l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CreerRaccourci("C:\\sudev\\vivien\\magic8\\MGrntw.exe", "Raccourci vers MGrntw.exe", "", NULL, 0, "C:\\Documents and Settings\\Tom\\Bureau\\C.I.P.lnk");

  15. #15
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    bon, en fait, je crois que c'est tout bete

    Je ne suis pas sur que tu ais la macro UNICODE de définie, et comme en plus, tu as enlevé la méthode non unicode, il faut que tu enleves les deux macros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    #ifdef UNICODE 
    #endif
    Le plus propre aurait été de les mettre autour de ton prototype aussi s'il y avait eu la version non unicode, mais je pense que là, il te suffit de les enlever et ca sera OK

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Non.......si je les enleve le compilo me sort encore les memes erreurs et 4 en plus.......

  17. #17
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    je n'arrive pas à savoir dans quel mode tu es

    tu as simplement créé un projet MFC (appwizard), selectionné Dialog Based et c'est tout ?

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    Je suis sous VS .NET 2003......
    J'ai fait 'Nouveau Projet' -> 'Projet Visual C++' -> 'Application MFC'.....

  19. #19
    Rédacteur
    Avatar de nico-pyright(c)
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    6 414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 6 414
    Par défaut
    salut, j'ai essayé avec VS.Net, je n'ai pas d'erreur avec cette fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    int CSetup_CIPDlg::CreerRaccourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination)
    {
       HRESULT hr;
       CoInitialize(NULL);
        BOOL bRet = FALSE;
        IShellLink* psl;
        if (SUCCEEDED( CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (LPVOID*) &psl)))
        {
            IPersistFile* ppf;
            psl->SetPath(pathExe);
            psl->SetDescription(description);
          psl->SetArguments(argument);
            if (SUCCEEDED(psl->QueryInterface(IID_IPersistFile, (LPVOID *)&ppf)))
          {
             wchar_t wsz[MAX_PATH];
             MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, destination, -1, wsz, MAX_PATH);
             hr = psl->SetIconLocation(iconePath, iconeIndex);   
             if(SUCCEEDED(ppf->Save(wsz, TRUE)))
                bRet = TRUE;
             ppf->Release();
          }
            psl->Release();
       }
       return bRet;
    }

  20. #20
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 90
    Par défaut
    CA Y EST ........ !!!!!!
    CA MARCHE

    MERCI BEAUCOUP D'AVOIR PASSE TOUT CE TEMPS POUR RESOUDRE MON PROBLEME.......
    FRANCHEMENT MERCI

    Mais il y a juste un problème :
    Quand je clique-droit sur le raccourci : la case 'Démarrer dans' est vide et j'en ai besoin pour que ca marche.....
    Tu sais comment je pourrais faire pour la remplir ??

    Je te jure que c'est la derniére question que je te pose !!!!

    Cheper

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Suppression/création de shortcut sur le bureau
    Par benkunz dans le forum VBScript
    Réponses: 5
    Dernier message: 30/08/2010, 07h58
  2. [VB.NET][2.0] créer un raccourcis sur le bureau ?
    Par BorisB dans le forum Windows Forms
    Réponses: 3
    Dernier message: 02/10/2006, 14h54
  3. Réponses: 11
    Dernier message: 14/08/2006, 00h13
  4. Créer un raccourci sur le bureau
    Par NdmaX dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/04/2006, 17h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo