le dernier paramètre est un int donc DWORD non?
De tout façon je n'utilise pas mon DWORD, je fais un sizeof de mon chemin. (il y avait un petite erreur dans le code)
Version imprimable
le dernier paramètre est un int donc DWORD non?
De tout façon je n'utilise pas mon DWORD, je fais un sizeof de mon chemin. (il y avait un petite erreur dans le code)
Je parle du SECOND paramètre, ici.
Edit: Ah, tu as corrigé depuis.
Y a un truc que je ne comprend pas.
Le code suivant ne fonctionne pas ?
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 SHELLEXECUTEINFO lpExecInfo; TCHAR chemin[]=_T("\\Temp\\test.pdf"); memset(&lpExecInfo, 0, sizeof(SHELLEXECUTEINFO)); lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo.lpFile = chemin; lpExecInfo.lpParameters = _T(""); lpExecInfo.lpDirectory = _T(""); lpExecInfo.lpVerb = _T("open"); lpExecInfo.nShow = SW_SHOWNORMAL; lpExecInfo.fMask = 0; lpExecInfo.hwnd = 0; lpExecInfo.hInstApp = 0; ShellExecuteEx(&lpExecInfo);
je pense que oui 3DArchi, mais le problème c'est que je n'ai pas :
Le chemin est contenu dans un CHAR[256] (enfaite c'est envoyer depuis une autre application). Donc je ne peux pas définir une variable contenant le chemin, je dois "convertir" ou rendre utilisable un char[256])"\\Temp\\test.pdf".Code:TCHAR chemin[]=_T("\\Temp\\test.pdf");
Le problème, c'est que tu ne sais pas si TCHAR correspond à CHAR ou à WCHAR.
Tu devrais passer par un template :
Code:
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 template<typename SourceT, typename DestinationT> struct convert; template<> struct convert<CHAR,CHAR>{ static bool DoIt( LPSTR pszSource, LPSTR pszDestination, DWORD dwDestSize ) { strncat(pszDestination,pszSource,dwDestSize-1); return true; } }; template<> struct convert<CHAR,WCHAR>{ static bool DoIt( LPSTR pszSource, LPWSTR pszDestination, DWORD dwDestSize ) { int iRet = MultiByteToWideChar( CP_ACP, 0, pszSource, -1, pszDestination, dwDestSize ); return ( 0 != iRet ); } }; // SHELLEXECUTEINFO lpExecInfo; TCHAR chemin[MAX_PATH]; CHAR Entree[255]; convert<CHAR,TCHAR>::DoIt(Entree,chemin,MAX_PATH); memset(&lpExecInfo, 0, sizeof(SHELLEXECUTEINFO)); lpExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); lpExecInfo.lpFile = chemin; lpExecInfo.lpParameters = _T(""); lpExecInfo.lpDirectory = _T(""); lpExecInfo.lpVerb = _T("open"); lpExecInfo.nShow = SW_SHOWNORMAL; lpExecInfo.fMask = 0; lpExecInfo.hwnd = 0; lpExecInfo.hInstApp = 0; ShellExecuteEx(&lpExecInfo);
J'ai tenté ceci également :
Rien ne se passe, la compilation est bonne, mais le pdf ne se lance pas.Code:
1
2
3
4
5
6
7 const char * szAscii="\\Temp\\test.pdf"; wchar_t * szUnicode; int len, i; len = strlen(szAscii); for(i=0;i<len+1;i++) *szUnicode++ = static_cast<wchar_t>(*szAscii++);
Une chaine de caractères ANSI (char *) ne peut pas se transformer en chaine de caractères Unicode (wchar_t *) à l'aide d'un simple cast comme tu le fais. Il faut obligatoirement passer par une fonction de transformation. La réciproque est vraie aussi (passage de Unicode à Ansi), il faut aussi utiliser une autre fonction, pas de cast sauvage, sinon, c'est souvent le crash.
Ceci dit, ton problème commence par le fait que tu ne sais pas le modèle que tu utilises (Unicode ou Ansi) et que tu essayes les fonctions et les paramètres un peu au hazard de ce que l'on déduit du peu d'information que tu donnes.
Donc est ce que tu peux faire une petite synthèse :
- Environnement de développement
- Plateforme de développement
- Plateforme cible (si différent de la plateforme de dev)
- Modèle utilisé (Unicode ou non unicode)