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

Windows Discussion :

Créer un raccourci, pb d'adaptation de code de VC++ à C


Sujet :

Windows

  1. #1
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut Créer un raccourci, pb d'adaptation de code de VC++ à C
    Bonjour à tous,

    J'aimerais faire un exe qui crée des raccourcis, j'ai trouvé qq sources seulement il n'y a rien en C pour Dev C, il n'y a que des sources en VC++ (que je ne maitrise pas).

    Est ce que quelqu'un pourrait m'aider à convertir cette source:

    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
    #include <stdio.h>
    #include <windows.h> 
    #include <shlobj.h> 
    #include <commdlg.h> 
      
    void AddInStartupGrp&#40;LPSTR szShortcutFile,LPSTR szSourcePath&#41;&#123;
        HRESULT hres;
        IShellLink *psl;
        char LNKpath&#91;_MAX_PATH&#93;;
        WORD wsLNKpath&#91;MAX_PATH&#93;;
        LPITEMIDLIST pItemIDlist;
        
        SHGetSpecialFolderLocation&#40;m_hWnd,CSIDL_STARTUP,&pItemIDlist&#41;;
        SHGetPathFromIDList&#40;pItemIDlist,LNKpath&#41;;
        strcat&#40;LNKpath,"\\"&#41;;
        strcat&#40;LNKpath,"szShortcutFile"&#41;;
        
        hres = CoCreateInstance&#40;CLSID_ShellLink, NULL,
        CLSCTX_INPROC_SERVER,
        IID_IShellLink,&#40;void **&#41;&psl&#41;;
        if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123;
            IPersistFile *ppf;
            hres = psl->QueryInterface&#40;IID_IPersistFile,&#40;void **&#41;&ppf&#41;;
            if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123;
            hres = psl->SetPath&#40;szSourcePath&#41;;
            MultiByteToWideChar&#40;CP_ACP, 0, LNKpath, -1,
            wsLNKpath,MAX_PATH&#41;;
            hres = ppf->Save&#40;wsLNKpath,FALSE&#41;;
            ppf->Release &#40;&#41;;
        &#125;
        psl->Release &#40;&#41;;
    &#125;// */
    Certaines fonctions et variables sont inconnues (pb de bibliotheques ?)

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    C'est une question pour le forum Développement Windows.
    C'est uniquement une question de libraires et d'include.
    Le code indiqué compile-t-il sous VC6 ?
    Si oui, c'est qu'il te manque les bons fichiers .h, éventuellemnt la bonne version de Dev C.
    Consulte aussi le forum "Outil pour C/C++.

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Créer un raccourci, pb d'adaptation de code de VC++ à C
    Citation Envoyé par dacid
    Certaines fonctions et variables sont inconnues (pb de bibliotheques ?)
    <Developpement Windows>
    Mon Dev-C++ trouve bien les fichiers d'entête (j'ai évidemment installé l'extension Win32...), mais il y a des fautes de frappes et des incohérences... Peut être des problèmes de version de Win32...
    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
    main.c&#58; In function `AddInStartupGrp'&#58;
    main.c&#58;9&#58; error&#58; `_MAX_PATH' undeclared &#40;first use in this function&#41;
    main.c&#58;9&#58; error&#58; &#40;Each undeclared identifier is reported only once
    main.c&#58;9&#58; error&#58; for each function it appears in.&#41;
    main.c&#58;13&#58; error&#58; `m_hWnd' undeclared &#40;first use in this function&#41;
    main.c&#58;20&#58; warning&#58; dereferencing type-punned pointer will break strict-aliasing rules
    main.c&#58;20&#58; error&#58; incompatible type for argument 1 of `CoCreateInstance'
    main.c&#58;20&#58; error&#58; incompatible type for argument 4 of `CoCreateInstance'
    main.c&#58;23&#58; error&#58; structure has no member named `QueryInterface'
    main.c&#58;23&#58; warning&#58; dereferencing type-punned pointer will break strict-aliasing rules
    
    main.c&#58;25&#58; error&#58; structure has no member named `SetPath'
    main.c&#58;28&#58; error&#58; structure has no member named `Save'
    main.c&#58;29&#58; error&#58; structure has no member named `Release'
    main.c&#58;31&#58; error&#58; structure has no member named `Release'
    main.c&#58;32&#58; error&#58; syntax error at end of input
    main.c&#58;9&#58; warning&#58; unused variable `LNKpath'
    </>

  4. #4
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Oui, c'est ce que j'entendais.

    J'ai pris cette source sur la msdn.

    Elle contient des objets et des appels que je ne connais pas, ce n'est donc pas uniquement un problème de bibliothèque mais aussi (et surtout, je pense) une adaptation de code.

    Quand à la version de Dev, c'est la dernière en date.

    Personne n'a jamais eu besoin de faire des raccourcis avant l'objet ?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    (edit: j'ai dit une connerie)

  6. #6
    Inactif  

    Homme Profil pro
    Ingénieur test de performance
    Inscrit en
    Décembre 2003
    Messages
    1 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur test de performance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 986
    Points : 2 605
    Points
    2 605
    Par défaut
    Je pense que c'est juste un problème de librairie (ou de version de compilateur). Confère MSDN. Les objets COM sont justement utilisables dans plusieurs langages.

  7. #7
    mat.M
    Invité(e)
    Par défaut
    oui mais est-ce qu'on peut faire de la programmation COM avec Dev C++ ??
    Eh oui c'est peut-être là le problème
    Tu peux faire des programmes win32 mais peut-être pas COM .
    A voir
    Sinon faut VC++ 7

  8. #8
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Suis-je le premier à vouloir faire un raccourci en C ?

    C'est tout de même incroyable.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Ce n'est pas un code spécifique à VC++.
    Le code de la MSDN nessecite souvent une petite adaptation car ce sont des extraits fournis. Il suffit de lire les messages d'erreur:
    `m_hWnd' undeclared (first use this function)
    dans ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SHGetSpecialFolderLocation&#40;m_hWnd,CSIDL_STARTUP,&pItemIDlist&#41;;
    d'où sort m_hWnd ? De nul part, c'est simplement un problème de variable non déclarée... Met NULL si tu n'as pas de fenêtre.
    Ensuite il manque l'accolade fermante du 2°
    if (SUCCEEDED (hres)){
    et faut remplacer
    WORD wsLNKpath[MAX_PATH];
    par
    WCHAR wsLNKpath[MAX_PATH];
    Y'a aussi un drôle de truc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        strcat&#40;LNKpath,"\\"&#41;; 
        strcat&#40;LNKpath,"szShortcutFile"&#41;;
    je suis pas sur que concaténer le mot "szShortcutFile" soit l'effet recherché... J'aurais personnelement une préférence pour PathAppend à la place de ces 2 appels à strcat.
    Tant qu'on y est, remplace _MAX_PATH par MAX_PATH.
    On obtient:
    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
    void AddInStartupGrp&#40;LPSTR szShortcutFile,LPSTR szSourcePath&#41;&#123; 
        HRESULT hres; 
        IShellLink *psl; 
        CHAR LNKpath&#91;MAX_PATH&#93;; 
        WCHAR wsLNKpath&#91;MAX_PATH&#93;; 
        LPITEMIDLIST pItemIDlist; 
        
        SHGetSpecialFolderLocation&#40;NULL,CSIDL_STARTUP,&pItemIDlist&#41;; 
        SHGetPathFromIDList&#40;pItemIDlist,LNKpath&#41;;
        strcat&#40;LNKpath,"\\"&#41;; 
        strcat&#40;LNKpath, szShortcutFile&#41;; 
        
        hres = CoCreateInstance&#40;
             CLSID_ShellLink, 
             NULL, 
             CLSCTX_INPROC_SERVER, 
             IID_IShellLink,
             &#40;void **&#41;&psl&#41;; 
        if &#40;SUCCEEDED &#40;hres&#41;&#41;
        &#123; 
            IPersistFile *ppf; 
            hres = psl->QueryInterface&#40;IID_IPersistFile,&#40;void **&#41;&ppf&#41;; 
            if &#40;SUCCEEDED &#40;hres&#41;&#41;
            &#123; 
                hres = psl->SetPath&#40;szSourcePath&#41;; 
                MultiByteToWideChar&#40;
                    CP_ACP, 
                    0, 
                    LNKpath, 
                    -1, 
                    wsLNKpath,
                    MAX_PATH&#41;; 
                hres = ppf->Save&#40;wsLNKpath,FALSE&#41;; 
                ppf->Release &#40;&#41;; 
            &#125;
        &#125; 
        psl->Release &#40;&#41;; 
    &#125;
    N'oublie pas avant d'appeler AddInStartupGrp d'initialiser quelque part COM via CoInitialize.

    et ça compile. Reste à linker avec libole32 et libuuid, et tu obtiens ton zoli exe

  10. #10
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Excusez moi de vous demander tant mais c'est vrai que je suis un peu complètement perdu.

    La fonction: CoCreateInstance() plante a cause du premier argument (CLSID_ShellLink) qu'il ne connait pas:
    22 C:\...\main.c incompatible type for argument 1 of `CoCreateInstance'

    Il attend ue variable de type: REFCLSID et j'avoue que je ne sais pas du tout ce que c'est !

    De plus, les: "psl->, etc..." sont typiques de l'objet, or en c, ce n'est pas de l'objet. Me suffit-il de les enlever ?

  11. #11
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tu es en C... ça rend les choses plus complexes pour rien. Mais bon.
    Il attend un REFCLSID, c.a.d une référence. Mais en C, y'a pas de référence, et REFCLSID devient un pointeur. Tente donc de remplacer CLSID_ShellLink par
    &CLSID_ShellLink.
    De plus, les: "psl->, etc..." sont typiques de l'objet, or en c, ce n'est pas de l'objet. Me suffit-il de les enlever ?
    Le langage C n'est pas objet, mais rien n'empêche de faire de l'objet en C. La preuve, tu fais du COM, et COM, c'est du pur jus objet. Ou encore GTK : c'est du C, mais orienté objet.
    Pour faire simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IShellLink *psl;
    // bla bla bla
    tu récupères un tableau de pointeurs de fonctions via psl. Si tu regardes la définition de IShellLink:
    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
    DECLARE_INTERFACE_&#40;IShellLinkA, IUnknown&#41;
    &#123;
    	STDMETHOD&#40;QueryInterface&#41;&#40;THIS_ REFIID,PVOID*&#41; PURE;
    	STDMETHOD_&#40;ULONG,AddRef&#41;&#40;THIS&#41; PURE;
    	STDMETHOD_&#40;ULONG,Release&#41;&#40;THIS&#41; PURE;
    	STDMETHOD&#40;GetPath&#41;&#40;THIS_ LPSTR,int,WIN32_FIND_DATAA*,DWORD&#41; PURE;
    	STDMETHOD&#40;GetIDList&#41;&#40;THIS_ LPITEMIDLIST*&#41; PURE;
    	STDMETHOD&#40;SetIDList&#41;&#40;THIS_ LPCITEMIDLIST&#41; PURE;
    	STDMETHOD&#40;GetDescription&#41;&#40;THIS_ LPSTR,int&#41; PURE;
    	STDMETHOD&#40;SetDescription&#41;&#40;THIS_ LPCSTR&#41; PURE;
    	STDMETHOD&#40;GetWorkingDirectory&#41;&#40;THIS_ LPSTR,int&#41; PURE;
    	STDMETHOD&#40;SetWorkingDirectory&#41;&#40;THIS_ LPCSTR&#41; PURE;
    	STDMETHOD&#40;GetArguments&#41;&#40;THIS_ LPSTR,int&#41; PURE;
    	STDMETHOD&#40;SetArguments&#41;&#40;THIS_ LPCSTR&#41; PURE;
    	STDMETHOD&#40;GetHotkey&#41;&#40;THIS_ PWORD&#41; PURE;
    	STDMETHOD&#40;SetHotkey&#41;&#40;THIS_ WORD&#41; PURE;
    	STDMETHOD&#40;GetShowCmd&#41;&#40;THIS_ int*&#41; PURE;
    	STDMETHOD&#40;SetShowCmd&#41;&#40;THIS_ int&#41; PURE;
    	STDMETHOD&#40;GetIconLocation&#41;&#40;THIS_ LPSTR,int,int*&#41; PURE;
    	STDMETHOD&#40;SetIconLocation&#41;&#40;THIS_ LPCSTR,int&#41; PURE;
    	STDMETHOD&#40;SetRelativePath&#41;&#40;THIS_ LPCSTR ,DWORD&#41; PURE;
    	STDMETHOD&#40;Resolve&#41;&#40;THIS_ HWND,DWORD&#41; PURE;
    	STDMETHOD&#40;SetPath&#41;&#40;THIS_ LPCSTR&#41; PURE;
    &#125;;
    en gros, en C, c'est transformé en une espèce de struct qui contient des pointeur vers des fonctions. Donc, en gros, psl est un pointeur vers un tableau de pointeurs de fonctions. En objet on appelle ça une vtable.
    Donc, psl->SetPath c'est le moyen normal de désigner le champ SetPath de ce qui est pointé par psl. Et comme c'est un pointeur de fonction, tu peux l'appeler directement.
    Sauf que, comme tu dis, le C n'est pas orienté objet. Dans un langage objet, un pointeur this implicite va être automatiquement passé en 1° argument. Pas en C, donc c'est à toi de le donner. Les appels:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    psl->SetPath&#40;szSourcePath&#41;;
    ppf->Save&#40;wsLNKpath,FALSE&#41;;
    ppf->Release &#40;&#41;;
    psl->Release &#40;&#41;;
    deviennent:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    psl->SetPath&#40; psl, szSourcePath&#41;;
    ppf->Save&#40; ppf, wsLNKpath,FALSE&#41;;
    ppf->Release &#40; ppf &#41;;
    psl->Release &#40; psl &#41;;

  12. #12
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Pour le hres = CoCreateInstance(&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,(void **)&psl);
    J'ai du mettre un & à IID_IShellLink et c'est passé.

    Par contre, psl->SetPath( psl, szSourcePath);
    ne passe pas, pas plus que psl->SetPath(szSourcePath);
    Il me met:
    27 C:\...\main.c structure has no member named `SetPath'

    Est-tu sur qu'il comprends le: -> ?

    Pour avancer, je les ai enlevés: hres = SetPath(psl,szSourcePath);
    (Ce qui me semble plus logique) et la, il compile bien mais il fait des erreur au linkage:
    [Linker error] undefined reference to `CoCreateInstance@20'
    [Linker error] undefined reference to `QueryInterface'
    [Linker error] undefined reference to `SetPath'
    [Linker error] undefined reference to `Save'
    [Linker error] undefined reference to `Release'
    [Linker error] undefined reference to `Release'

    Toutes les fonctions utiles, quoi !

    Si ça peut t'aider, voici le code tel qu'il est maintenant:

    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
    #define _WIN32_IE 0x0400
    #include <stdio.h>
    #include <windows.h>
    #include <shlobj.h>
    #include <commdlg.h>
    
    const GUID IID_IPersistFile2 =&#123;0x0000010b,0x0000,0x0000,&#123;0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46&#125;&#125;;
    
    
    void AddInStartupGrp&#40;LPSTR szShortcutFile,LPSTR szSourcePath&#41;&#123;
        HRESULT hres;
        IShellLink *psl;
        char LNKpath&#91;MAX_PATH&#93;;
        WCHAR wsLNKpath&#91;MAX_PATH&#93;;
        LPITEMIDLIST pItemIDlist;
        
        SHGetSpecialFolderLocation&#40;NULL,CSIDL_STARTUP,&pItemIDlist&#41;;
        SHGetPathFromIDList&#40;pItemIDlist,LNKpath&#41;;
        strcat&#40;LNKpath,"\\"&#41;;
        strcat&#40;LNKpath,"szShortcutFile"&#41;;
        
        hres = CoCreateInstance&#40;&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,&#40;void **&#41;&psl&#41;;
        if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123;
            IPersistFile *ppf;
            hres = QueryInterface&#40;IID_IPersistFile2,&#40;void **&#41;&ppf&#41;;
            if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123;
                hres = SetPath&#40;psl,szSourcePath&#41;;
                MultiByteToWideChar&#40;CP_ACP, 0, LNKpath, -1,
                wsLNKpath,MAX_PATH&#41;;
                hres = Save&#40;ppf,wsLNKpath,FALSE&#41;;
                Release &#40;ppf&#41;;
            &#125;
        &#125;
        Release &#40;psl&#41;;
    &#125;

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par dacid
    Est-tu sur qu'il comprends le: -> ?
    oui, c'est l'opérateur d'indirection de base en C.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Toto
    &#123;
        int A;
        void &#40;*fonction&#41;&#40;void&#41;; // pointeur de fonction
    &#125;;
    
    struct Toto * t = //...;
    t->A = 10;
    t->fonction&#40;&#41;;
    J'ai jamais fait de COM en C, donc j'ai loupé un petit passage. La fameuse vtable, elle est pas adressable directement.

    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
    #else 	/* C style interface */
    
        typedef struct IPersistFileVtbl
        &#123;
            BEGIN_INTERFACE
            
            HRESULT &#40; STDMETHODCALLTYPE *QueryInterface &#41;&#40; 
                IPersistFile * This,
                /* &#91;in&#93; */ REFIID riid,
                /* &#91;iid_is&#93;&#91;out&#93; */ void **ppvObject&#41;;
            
            ULONG &#40; STDMETHODCALLTYPE *AddRef &#41;&#40; 
                IPersistFile * This&#41;;
            
            ULONG &#40; STDMETHODCALLTYPE *Release &#41;&#40; 
                IPersistFile * This&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *GetClassID &#41;&#40; 
                IPersistFile * This,
                /* &#91;out&#93; */ CLSID *pClassID&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *IsDirty &#41;&#40; 
                IPersistFile * This&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *Load &#41;&#40; 
                IPersistFile * This,
                /* &#91;in&#93; */ LPCOLESTR pszFileName,
                /* &#91;in&#93; */ DWORD dwMode&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *Save &#41;&#40; 
                IPersistFile * This,
                /* &#91;unique&#93;&#91;in&#93; */ LPCOLESTR pszFileName,
                /* &#91;in&#93; */ BOOL fRemember&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *SaveCompleted &#41;&#40; 
                IPersistFile * This,
                /* &#91;unique&#93;&#91;in&#93; */ LPCOLESTR pszFileName&#41;;
            
            HRESULT &#40; STDMETHODCALLTYPE *GetCurFile &#41;&#40; 
                IPersistFile * This,
                /* &#91;out&#93; */ LPOLESTR *ppszFileName&#41;;
            
            END_INTERFACE
        &#125; IPersistFileVtbl;
    
        interface IPersistFile
        &#123;
            CONST_VTBL struct IPersistFileVtbl *lpVtbl;
        &#125;;
    Ce n'est pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    psl->QueryInterface&#40; psl, ... &#41;
    qu'il faut faire, mais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    psl->lpVtbl->QueryInterface&#40; psl, ... &#41;
    et cela pour tout le reste aussi.
    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
    void AddInStartupGrp&#40;LPSTR szShortcutFile,LPSTR szSourcePath&#41;&#123; 
        HRESULT hres; 
        IShellLink *psl; 
        char LNKpath&#91;MAX_PATH&#93;; 
        WCHAR wsLNKpath&#91;MAX_PATH&#93;; 
        LPITEMIDLIST pItemIDlist; 
        
        SHGetSpecialFolderLocation&#40;NULL,CSIDL_STARTUP,&pItemIDlist&#41;; 
        SHGetPathFromIDList&#40;pItemIDlist,LNKpath&#41;; 
        strcat&#40;LNKpath,"\\"&#41;; 
        strcat&#40;LNKpath,"szShortcutFile"&#41;; 
        
        hres = CoCreateInstance&#40;&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,&#40;void **&#41;&psl&#41;; 
        if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123; 
            IPersistFile *ppf; 
            hres = psl->lpVtbl->QueryInterface&#40; psl, &IID_IPersistFile,&#40;void **&#41;&ppf &#41;; 
            if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123; 
                hres = psl->lpVtbl->SetPath&#40; psl,szSourcePath &#41;; 
                MultiByteToWideChar&#40;CP_ACP, 0, LNKpath, -1, 
                wsLNKpath,MAX_PATH&#41;; 
                hres = ppf->lpVtbl->Save&#40; ppf,wsLNKpath,FALSE &#41;; 
                ppf->lpVtbl->Release&#40; ppf &#41;; 
            &#125; 
        &#125; 
        psl->lpVtbl->Release&#40; psl &#41;; 
    &#125;
    A quoi sert IID_IPersistFile2 ?

  14. #14
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Ca passe pour les dernières fonctions mais pas pour:

    hres = CoCreateInstance(&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,(void **)&psl);

    et

    hres = psl->lpVtbl->QueryInterface(psl,&IID_IPersistFile,(void **)&ppf);

    Qui font ces erreurs:
    [Linker error] undefined reference to `CoCreateInstance@20'
    [Linker error] undefined reference to `IID_IPersistFile'
    ld returned 1 exit status

  15. #15
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    C'est une erreur de link. La compilation est Ok.
    Citation Envoyé par Aurelien.Regat-Barrel
    Reste à linker avec libole32 et libuuid, et tu obtiens ton zoli exe
    dans Tools->Compiler Options, passe au linker:

  16. #16
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Bouhou !

    C'est bon, ça compile mais impossible de l'appeler:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int main&#40;int argc, char *argv&#91;&#93;&#41;&#123;
        char test&#91;&#93;="test",test2&#91;&#93;="test2";
        
        AddInStartupGrp&#40;test2,test&#41;;
        system&#40;"PAUSE"&#41;;
        return 0;
    &#125;
    Me fait une erreur windows:
    FaireRaccourci.exe a rencontré un problème et doit fermer. Nous vous prions de nous excuser pour le désagrément encouru.

    de plus, je ne vois pas l'interet de faire le parametre: szShortcutFile si ensuite, la variable n'est pas utilisée mais renseignée en dur:
    strcat(LNKpath,"\\");
    strcat(LNKpath,"szShortcutFile");

    Dans l'espoir de voir ce code marcher un jour !!!

  17. #17
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Oui, je te l'avais dit un peu plus haut.
    Le code MSDN est à adapter, en général ils ne gèrent pas trop les erreurs pour le racourcir. Localise le plantage au debuger.
    Faut tester le succès de SHGetSpecialFolderLocation/SHGetPathFromIDList, et pItemIDlist n'est pas libéré... remplace plutot par SHGetFolderPath.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        TCHAR LNKpath&#91; MAX_PATH &#93;;
        if &#40; FAILED&#40; SHGetFolderPath&#40;
            NULL,
            CSIDL_STARTUP,
            NULL,
            SHGFP_TYPE_CURRENT,
            path &#41; &#41; &#41;
        &#123;
            return false; // échec
        &#125;
    Ton exe ne marchera pas car tu n'a pas initialisé COM (CoInitialize(NULL)). Ca explique peut être le plantage, si SHGetPathFromIDList échoue et que LNKpath vaut n'importe quoi, strcat se vautre.

  18. #18
    Membre averti Avatar de dacid
    Homme Profil pro
    Inscrit en
    Juin 2003
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 064
    Points : 420
    Points
    420
    Par défaut
    Merci pour ton astuce d'initialiser COM, ça marche, j'ai Bien un raccourci dans le menu qui s'apelle bien: "szShortcutFile", mais par contre, il ne pointe vers rien du tout.

    J'ai essayé, ensuite, de changer ma fonction pour la tienne mais il ne connais pas le paramètre: SHGFP_TYPE_CURRENT:
    18 C:\...\main.c `SHGFP_TYPE_CURRENT' undeclared (first use in this function)
    (Each undeclared identifier is reported only once for each function it appears in.)

    Voici le code modifié:

    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
    void AddInStartupGrp&#40;LPSTR szShortcutFile,LPSTR szSourcePath&#41; &#123;
        HRESULT hres;
        IShellLink *psl;
        TCHAR LNKpath&#91;MAX_PATH&#93;; //char LNKpath&#91;MAX_PATH&#93;;
        WCHAR wsLNKpath&#91;MAX_PATH&#93;;
        LPITEMIDLIST pItemIDlist;
        
        CoInitialize&#40;NULL&#41;; // Initialisez COM
        SHGetSpecialFolderLocation&#40;NULL,CSIDL_STARTUP,&pItemIDlist&#41;;
        //SHGetPathFromIDList&#40;pItemIDlist,LNKpath&#41;;
        if &#40;FAILED&#40;SHGetFolderPath&#40;NULL,CSIDL_STARTUP,NULL,SHGFP_TYPE_CURRENT,LNKpath&#41;&#41;&#41; &#123; 
            exit; // échec 
        &#125;
        strcat&#40;LNKpath,"\\"&#41;;
        strcat&#40;LNKpath,szShortcutFile&#41;;
        free&#40;pItemIDlist&#41;; // Libère la variable
        
        hres = CoCreateInstance&#40;&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,&#40;void **&#41;&psl&#41;;
        if &#40;SUCCEEDED &#40;hres&#41;&#41; &#123;
            IPersistFile *ppf;
            hres = psl->lpVtbl->QueryInterface&#40;psl,&IID_IPersistFile,&#40;void **&#41;&ppf&#41;;
            if &#40;SUCCEEDED &#40;hres&#41;&#41;&#123;
                hres = psl->lpVtbl->SetPath&#40;psl,szSourcePath&#41;;
                MultiByteToWideChar&#40;CP_ACP,0,LNKpath,-1,wsLNKpath,MAX_PATH&#41;;
                hres = ppf->lpVtbl->Save&#40;ppf,wsLNKpath,FALSE&#41;;
                ppf->lpVtbl->Release&#40;ppf&#41;;
            &#125;
        &#125;
        psl->lpVtbl->Release &#40;psl&#41;;
    &#125;// */
    
    int main&#40;int argc, char *argv&#91;&#93;&#41;&#123;
        char chemin&#91;&#93;="C&#58;\\WINDOWS\\explorer.exe",nom&#91;&#93;="test2";
        
        AddInStartupGrp&#40;nom,chemin&#41;;
        return 0;
    &#125;

  19. #19
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Met 0 à la place de SHGFP_TYPE_CURRENT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    free&#40;pItemIDlist&#41;; // Libère la variable
    ça c'est faux. pItemIDlist n'a pas été alloué via malloc, mais via COM. Il faut le libérer via COM
    http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shgetspecialfolderlocation.asp
    The calling application is responsible for freeing this pointer with the Shell's IMalloc interface (see SHGetMalloc).

  20. #20
    mat.M
    Invité(e)
    Par défaut
    Et en plus il oublie d'appeler CoUnItialize

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

Discussions similaires

  1. Code pour créer un raccourci
    Par Admirall dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 10/07/2013, 19h16
  2. Est-il possible de crer un raccourci vers un reperoire ???
    Par Florina dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 13/12/2005, 09h33
  3. [c#]Créer un raccourcie clavier
    Par reptils dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/10/2005, 15h44
  4. [VBA Excel Word]Adapter un code Excel a Word
    Par Baxter67 dans le forum VBA Word
    Réponses: 4
    Dernier message: 08/08/2005, 23h43
  5. Créer un raccourci vers un logiciel et un fichier
    Par romram dans le forum Autres Logiciels
    Réponses: 3
    Dernier message: 12/05/2005, 15h32

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