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
![]()
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
![]()
salut, regarde cette classe ici marche tres bien http://www.codeproject.com/shell/CShortcut.asp?df=100
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) :
Ces fonctions : MultiByteToWideChar et IPersistFile::Save sont des fonctions fourni dans le .cpp que j'ai téléchargé.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
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
![]()
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; }
Désolé mais ca me donne les memes erreurs....
Et juste une question à part : c'est quoi être en unicode???
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
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; }
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)
Je suis désolé de te redemander ca, mais pourrait tu me dire comment y remédier ??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)
Un enorme merci d'avance........
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 ?
Je suis toujours dans le cadre d'une appli basée dialogue.....
Dans le .h :
Dans le .cpp :protected:
int CreerRaccourci(char * pathExe, char * description, char * argument, char *iconePath, int iconeIndex, char * destination);
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.CreerRaccourci("C:\\sudev\\vivien\\magic8\\MGrntw.exe", "Raccourci vers MGrntw.exe", "", NULL, 0, "C:\\Documents and Settings\\Tom\\Bureau\\C.I.P.lnk");
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 ?
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 !)![]()
et l'implémentation, montre voir le code
Ca c'est le code de ta fonction CreerRaccourciW :
Ca c'est l'appel :
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
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");
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 macrosLe 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
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 #ifdef UNICODE #endif![]()
Non.......si je les enleve le compilo me sort encore les memes erreurs et 4 en plus.......
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 ?
Je suis sous VS .NET 2003......
J'ai fait 'Nouveau Projet' -> 'Projet Visual C++' -> 'Application MFC'.....
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; }
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
![]()
Partager