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

Résolu
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 - 4 oct. 2005 à 16:01
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 - 7 oct. 2005 à 19:42
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:



,
----

#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
#include <commdlg.h>

void AddInStartupGrp(LPSTR szShortcutFile,LPSTR szSourcePath){
HRESULT hres;
IShellLink *psl;
char LNKpath[_MAX_PATH];
WORD wsLNKpath[MAX_PATH];
LPITEMIDLIST pItemIDlist;

SHGetSpecialFolderLocation(m_hWnd,CSIDL_STARTUP,&pItemIDlist);
SHGetPathFromIDList(pItemIDlist,LNKpath);
strcat(LNKpath,"\\");
strcat(LNKpath,"szShortcutFile");

hres = CoCreateInstance(CLSID_ShellLink, NULL,
CLSCTX_INPROC_SERVER,
IID_IShellLink,(void **)&psl);
if (SUCCEEDED (hres)){
IPersistFile *ppf;
hres = psl->QueryInterface(IID_IPersistFile,(void **)&ppf);
if (SUCCEEDED (hres)){
hres = psl->SetPath(szSourcePath);
MultiByteToWideChar(CP_ACP, 0, LNKpath, -1,
wsLNKpath,MAX_PATH);
hres = ppf->Save(wsLNKpath,FALSE);
ppf->Release ();
}
psl->Release ();
}// */

Certaines fonctions et variables sont inconnues (pb de bibliotheques ?)

Merci d'avance.

David, à VERSAILLES

16 réponses

racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
7 oct. 2005 à 19:42
J'ai déjà testé le code. Le raccourci est bien créé dans le menu
démarrage avec l'icone de l'explorer. En faisant un clic droit sur ce
raccourci pour voir ses propriétés on voit que tout est normal et que
le chemin est correct. Tu dois déboguer ton programme pour exécuter pas
à pas la fonction AddInStartupGrp(). Tu finiras par trouver la cause du problème. Il s'agit certainement d'un petit oubli.
3
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
4 oct. 2005 à 19:40
Salut,

Au debut de ton code tu fais:

#define _WIN32_IE 0x0400

#include <windows.h>

#include .......

Puis juste après tu fais:

const GUID IID_IPersistFile2 ={0x0000010b,0x0000,0x0000,{0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46}};



Dans le reste du code tu remplaces IID_IPersistFile par IID_IPersistFile2.

Je viens de faire le test et ça marche.
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
4 oct. 2005 à 19:45
spécifie ce que tu souhaites exactement,/ ce que tu ne comprend pas...

je ne me sens pas de te traduire le tt en 2 sec....




sinon, les msdn sont en lignes pour t'aider à tt comprendre..


___________________________________________________________
Magicalement
Nono
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
5 oct. 2005 à 09:28
Bonjour maqic_nono etracpp,

Suite à tes astuces, il ne connait pas la variable: m_hWnd (Qui doit être de type HWND, Qu'est ce que c'est que ça ?)

De plus, la msdn est bien pratique quand tu utilise des outils microsoft, mais autrement......

Pour transformer un objet C++:
hres = psl->QueryInterface(IID_IPersistFile2,(void **)&ppf);
en interface c, il suffit de faire ca:
hres = QueryInterface(IID_IPersistFile2,&ppf);
Me trompe-je ?

David, à VERSAILLES
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
5 oct. 2005 à 10:56
m_hWnd est avec Visual

le handle sur la dialog en question...



++

___________________________________________________________
Magicalement
Nono
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
5 oct. 2005 à 11:13
Donc (je ne croit pas avoir de dialog) je met NULL, alors ?

Pour transformer un objet C++:
hres = psl->QueryInterface(IID_IPersistFile2,(void **)&ppf);
en interface c, il suffit de faire ca:
hres = QueryInterface(IID_IPersistFile2,&ppf);
Me trompe-je ?

Désolé de vous soliciter tant mais je suis vraiment perdu !

David, à VERSAILLES
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
5 oct. 2005 à 11:15
m_hWnd est avec Visual

le handle sur la dialog en question...



++

___________________________________________________________
Magicalement
Nono
0
magic_Nono Messages postés 1878 Date d'inscription jeudi 16 octobre 2003 Statut Membre Dernière intervention 16 mars 2011
5 oct. 2005 à 11:18
je connais pas trop ce QueryInterface



mais il manque une ref à ton "psl"

___________________________________________________________
Magicalement
Nono
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 oct. 2005 à 15:00
Tu peux regarder ma source:

http://www.cppfrance.com/code.aspx?ID=28240

Pour la faire fonctionner avec Dev-C++ 4.9.9.2 il m'a suffit de faire les petites modifications precisees plus haut.

Sur la même page du code source tu trouveras les commentaires de Nebula qui a refait le code en puc C.

A propos du m_hWnd, il s'agit surement d'un problème de declaration. Tu ne peux pas mettre tout le code ici?
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
5 oct. 2005 à 15:05
Voici ce code:

#define _WIN32_IE 0x0400
#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
#include <commdlg.h>


void AddInStartupGrp(LPSTR szShortcutFile,LPSTR szSourcePath){
HRESULT hres;
IShellLink *psl;
char LNKpath[MAX_PATH];
WCHAR wsLNKpath[MAX_PATH];
LPITEMIDLIST pItemIDlist;

SHGetSpecialFolderLocation(NULL,CSIDL_STARTUP,&pItemIDlist);
SHGetPathFromIDList(pItemIDlist,LNKpath);
strcat(LNKpath,"\");
strcat(LNKpath,"szShortcutFile");

hres = CoCreateInstance(&CLSID_ShellLink,NULL,CLSCTX_INPROC_SERVER,&IID_IShellLink,(void **)&psl);
if (SUCCEEDED (hres)){
IPersistFile *ppf;
hres = psl->lpVtbl->QueryInterface(psl,&IID_IPersistFile,(void **)&ppf);
if (SUCCEEDED (hres)){
hres = psl->lpVtbl->SetPath(psl,szSourcePath);
MultiByteToWideChar(CP_ACP,0,LNKpath,-1,wsLNKpath,MAX_PATH);
hres = ppf->lpVtbl->Save(ppf,wsLNKpath,FALSE);
ppf->lpVtbl->Release(ppf);
}
}
psl->lpVtbl->Release (psl);
}// */

Il compile mais me renvoie l'erreur de linkage:

[Linker error] undefined reference to [mailto:`CoCreateInstance@20' `CoCreateInstance@20']
[Linker error] undefined reference to `IID_IPersistFile'
ld returned 1 exit status

David, à VERSAILLES
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 oct. 2005 à 15:45
Tu n'as pas oublie de mettre l'option -lole32?

Il faut aussi remplacer IID_IPersistFile par IID_IPersistFile2 definie au debut du code.

Je vais tester ton code.
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
5 oct. 2005 à 15:53
Heu...

C'est quoi l'option -lole32, c'est une blague (je sais pas moi: lol) ?

David, à VERSAILLES
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 oct. 2005 à 17:19
Voici ton code légérement modifié:

void AddInStartupGrp(LPSTR szShortcutFile,LPSTR szSourcePath)

{

HRESULT hres;

IShellLink *psl;

char LNKpath[MAX_PATH];

WCHAR wsLNKpath[MAX_PATH];

LPITEMIDLIST pItemIDlist;

CoInitialize(0);

SHGetSpecialFolderLocation(NULL,CSIDL_STARTUP,&pItemIDlist);

SHGetPathFromIDList(pItemIDlist,LNKpath);

strcat(LNKpath,"\");

strcat(LNKpath,"szShortcutFile");



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

if (SUCCEEDED (hres))

{

IPersistFile *ppf;

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

if (SUCCEEDED (hres))

{

hres = psl->lpVtbl->SetPath(psl,szSourcePath);

MultiByteToWideChar(CP_ACP,0,LNKpath,-1,wsLNKpath,MAX_PATH);

hres = ppf->lpVtbl->Save(ppf,wsLNKpath,FALSE);

ppf->lpVtbl->Release(ppf);

}

}

psl->lpVtbl->Release (psl);

CoUninitialize();

}

En fait, tu as oublié d'initialiser la librairie COM avec CoInitialize().

Pour ajouter les options de compilation à ton projet dans Dev-C++ tu fais:

1- Aller au menu Outils.

2- Choisir Options du compilateur.

3 - Dans l'onglet Compilateur tu coches la case Ajouter ces commandes lors de l'appel de l'éditeur de liens.

4- Taper -lole32 -luuid . Ces deux options ont pour effet d'ajouter les librairies ole32.lib et uuid.lib au projet. Grâce à cette dernière option tu n'auras plus besoin d'utiliser IID_IPersistFile2 car IID_IPersistFile sera reconnue.

Voilà, bonn eprogrammation.
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
5 oct. 2005 à 17:46
Cool,

En fait, j'avais avancé un peu et j'ai fini par trouver ou mettre ces options dans le compilateur et à initialiser COM, j'avais donc un code un peu différent du tient mais qui compilait qd même.
Seulement, j'ai le même pb avec le mien qu'avec le tient:

Je l'apelle comme ça:
int main(int argc, char *argv[]){
char chemin[]="C:\\WINDOWS\\explorer.exe",nom[]="test2";

AddInStartupGrp(nom,chemin);
return 0;
}

Seulement, il me met bien le raccourci du nom: "test2" dans le menu mais il ne pointe vers rien (cheminn'est pas prise en compte).

David, à VERSAILLES
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
5 oct. 2005 à 21:05
Dans ta fonction AddInStartupGrp() tu fais:

SHGetPathFromIDList(pItemIDlist,LNKpath);

strcat(LNKpath,"\");

strcat(LNKpath,szShortcutFile); // enlever les guillemets

strcat(LNKpath,".lnk"); // ajouter l'extesion .lnk
0
cs_nitrique Messages postés 344 Date d'inscription jeudi 1 mai 2003 Statut Membre Dernière intervention 4 avril 2011 1
6 oct. 2005 à 09:59
Heu... Ca ne change pas grand chose.

David, à VERSAILLES
0
Rejoignez-nous