Voila mon code:Voila lorsque je lance windows me dit:xxx.exe a rencontrer un probleme et...Code:
1
2
3 HWND hwnd; LPCTSTR lpParameters; ShellExecute(hwnd,"open","Laby_Instal.exe",lpParameters,NULL,SW_HIDE);
Si vous savez comment m'aider...
Merci
Version imprimable
Voila mon code:Voila lorsque je lance windows me dit:xxx.exe a rencontrer un probleme et...Code:
1
2
3 HWND hwnd; LPCTSTR lpParameters; ShellExecute(hwnd,"open","Laby_Instal.exe",lpParameters,NULL,SW_HIDE);
Si vous savez comment m'aider...
Merci
Si la fonction demande des parametres, il suffit pas de passer des variables du type requis, il faut que ces variables valent ce dont la fonction a besoin.
Plus d'infos sur ce que tu dois mettre dans les parametres, ici :
http://msdn.microsoft.com/library/de...ellexecute.asp
Note, dans pas mal de cas, les fonctions de l'api windows acceptent des parametres NULL. (mais tes variables ne valaient meme pas NULL, elles valaient n'importe quoi)
En fait le programme c'est une archiveWIN RAR Auto extractible...Citation:
Envoyé par Gruik
Merci pour le lien mais j'ai deja essaier de le dechifrer et j'ai pus en tirer le code que j'ai posté!!!Citation:
Envoyé par Gruik
Merci qd meme.
Sur l'extrait de code que tu nous montres, lpParameters n'est pas initialisé et peut valoir n'importe quoi. J'espère que ce n'est pas le cas sur le code réel...
Si...Citation:
Envoyé par Médinoc
Et hwnd aussi...
Alors tu as plus de chances de gagner au loto.Citation:
Envoyé par miron
HWND est un handle (en gros un numéro unique) de l'appelant de la fonction ShellExecute.Code:
1
2 HWND hwnd;
tu obtiens ce handle lorsque tu fabriques la fenêtre.
Code:
1
2
3
4
5
6 HWND hwnd; hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hinstance, NULL);
C'est un pointeur vers les paramètres à donner à l'application. Si tu n'as pas de Paramètres a fournir tu le met à NULL.Code:
1
2 LPCTSTR lpParameters
Ce code lance OutlookExpressCode:
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 #include <windows.h> LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = NULL; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); wc.lpszMenuName = NULL; wc.lpszClassName = "MaWinClass"; if(!RegisterClass(&wc)) return FALSE; hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hinstance, NULL); if (!hwnd) return FALSE; ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); ShellExecute(hwnd,"open","C:\\Program Files\\Outlook Express\\msimn.exe",NULL,NULL,SW_SHOWDEFAULT); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } /******************************************************************************/ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: return 0; case WM_DESTROY: PostQuitMessage(0); return 0; default: return DefWindowProc(hwnd, uMsg, wParam, lParam); } }
Petite info
Si tu veux juste lancer le programme tu vires la boucle infini
et leCode:
1
2
3
4
5
6 while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); }
Ainsi ta fenêtre n'apparait jamais.Code:
1
2
3 ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd);
Il faut aussi remplacer dans le WinMain le :
parCode:
1
2return msg.wParam;
Pour retourner le bon code de fin.Code:
1
2 return EXIT_SUCCESS;
On simplifiera aussi la "pompe a message" :
Code:
1
2
3
4
5 LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hwnd, uMsg, wParam, lParam); }
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 #include <windows.h> LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS wc; wc.style = 0; wc.lpfnWndProc = MainWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 0; wc.hInstance = NULL; wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); wc.hCursor = LoadCursor(NULL, IDC_ARROW); wc.hbrBackground = (HBRUSH)(1 + COLOR_BTNFACE); wc.lpszMenuName = NULL; wc.lpszClassName = "MaWinClass"; if(!RegisterClass(&wc)) return FALSE; hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hinstance, NULL); if (!hwnd) return FALSE; ShellExecute(hwnd,"open","C:\\Program Files\\Outlook Express\\msimn.exe",NULL,NULL,SW_SHOWDEFAULT); return EXIT_SUCCESS; } /******************************************************************************/ LRESULT CALLBACK MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { return DefWindowProc(hwnd, uMsg, wParam, lParam); }
Ou bien, tu ne t'embarasses pas à créer une fenêtre et tu passes NULL...
Peut-être que je me suis trompé mais avec null je n'arrive a rien :roll:
[EDIT]: Ha bha non ca marche avec NULL.... je devais être fatigué moi hier soir... Sorry :oops: :dehors:
Merci pour ce long discours, heureusement que NULL fonctionne pour les paramettres par ce que dans le cas contraire, j'airais été tres mal !!!Citation:
Envoyé par Pikwik
Et pour HW... il fait mettre quoi, patrce que avec tt ca je suis perdu, je ne vaux pas lancer OOTLOOK mais seulement une Archive SFX (auto extractible ).
Le handle de ta fenêtre principale ou NULL si tu n'en as pas.Citation:
Envoyé par miron
Ce paramètre ne sert au système que pour savoir à quoi rattacher une boite modale s'il y a besoin.
Et ça te ferait un deuxième trou au c*l si tu remplaçais le chemin vers Outlook par le chemin vers ton archive auto-extractible ?Citation:
Envoyé par miron
Qu'on demande de l'aide, c'est une chose : le forum est fait pour ça. Mais il faut aussi y mettre un peu du sien, que diable !
Si c'est un développeur pas cher qui fasse tout le travail à ta place que tu cherches, il y a des sites pour ça.
Je ne vois pas de "HW" dans les exemples précédents (ceux donnés par Pikwik).Citation:
Envoyé par miron
Je vois un "type" appelé "HWND" et une variable appelée "hwnd". J'espère que ce n'est pas pour économiser tes forces que tu as omis les deux lettres qui suivaient...
Je vais supposer que tu parlais de la variable "hwnd" et, dans ce cas, je vais te demander de LIRE LA DOCUMENTATION.Maintenant : au boulot !Citation:
Envoyé par [url=http://msdn.microsoft.com/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp]Aide de ShellExecute[/url]
oui mais une archive auto extractible il y a une fenetre non?Citation:
Envoyé par David.Schris
J'aissais dutiliser Createprossess:
Mais apparement cela ne fonctionne pas, en fait le problemme est que avec shellexec, playsoud dans mon programme apelé ne fonctionne pas.Code:CreateProcess(dossier_temp,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,"C:\\Program Files\\PPB\\Laby",NULL,NULL);
Donc j'aissais avec createprossess.
Mais la c'est carement la fonction createprossess qui bug!
Je suis desespéré...
PS : Dossier temp contient l@ du programme a lancer.
Manifestement...Citation:
Envoyé par miron
- Tu n'as même pas pris la peine d'essayer le code qui t'a été donné : c'est sympa pour ceux qui ont pris sur leur temps pour toi.
- Tu n'as toujours pas lu la documentation.
Pour répondre à ta question ("une archive auto extractible il y a une fenetre non?") : pas forcément. Cela dépend de l'outil utilisé pour la créer, des options utilisées pour la créer, des options utilisées pour lancer l'exécutable chargé d'extraire les données.Citation:
Envoyé par [url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp]Aide de ShellExecute[/url]
Il y a un truc important qu'il va falloir comprendre : NULL ne veut pas à dire "je ne sais pas quoi mettre alors devine".Citation:
Envoyé par miron
Et encore une fois, tu n'as pas lu la documentation !On te dit que l'avant dernier doit être un pointeur vers une structure de type "STARTUPINFO" ou "STARTUPINFOEX". On ne te dit pas que tu peux mettre NULL.Citation:
Envoyé par [url=http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp]Aide de CreateProcess[/url]
Même remarque pour le dernier paramètre.
A mon humble avis, si tu as du mal avec ShellExecute, n'essaye pas avec CreateProcess.
Et qu'est-ce qui te fait dire que c'est à cause de ShellExecute ?Citation:
Envoyé par miron
C'est sûr. Tu n'y arrives pas du premier coup avec une fonction donc tu abandonnes et tu essayes avec une autre sans même chercher à comprendre d'où venait le problème...Citation:
Envoyé par miron
Ah oui ? Mince alors ! Vite ! Dis-le à Microsoft ! Tu vas les aider à corriger un bug qu'ils n'avaient pas vu !Citation:
Envoyé par miron
s/é/ant/ :(Citation:
Envoyé par miron
Enfin, toutes tes questions concernent des fonctions spécifiques à Windows : tu es dans le mauvais forum.
En C, tu aurais peut-être pu utiliser la fonction system() ?
Non pa spour lancer louto extractible car cela ne fonctionne pas.Citation:
Envoyé par David.Schris
Non mais il me semble que create prossess convit mieux a mon probleme.:(Citation:
Envoyé par David.Schris
Peu etre que je me trompe;...:oops:
C'est à dire ?Citation:
Envoyé par miron
Si tu vas voir ton docteur et que tu lui dis "je ne vais pas bien", tu crois qu'il va te donner un médicament sans te demander plus de précisions ? Ben là c'est pareil.
Pour le savoir, il faudrait une description plus précise du problème (cf. ma signature).Citation:
Envoyé par miron
OKCitation:
Envoyé par David.Schris
Tout d'abord sachez que pour le moment mon probleme est comment dire plus de presision que autre.
Pour faire simple j'ai un programme de gestion de programmes, qui donc est capable de trouver des fichier .pb, il sen sert, et j'ai une archive Win rar auto extractible.
Donc la cette archive contien des programmes et autre, c'est une archive d'instalation d'un programme.
Je desire donc "lancer" cette archive ("Laby_Instal.exe").
La je me dit Pierre utilise ShelleExecute !
Je cherche sur devellopez .com, msdn, et arive au bout de code suivant :Lors de la compilation mon compilo me dit :Code:
1
2 HWND hwnd; ShellExecute(hwnd,"open","Laby_Instal.exe",NULL,NULL,SW_HIDE);
La je me dit "il se pourais que ca pose des problemes," alors je crée une discussion sur dev.com.Citation:
Envoyé par Compilo
La on me dit il faut linitialiser...
Oui OK ca j'avais compris d'apres le Warning, mais avec quoi?
Tout content que je suis lorsque je revien sur le post et vois 5 ou 6 messages !
Mais la je decouvre des tones de ligne de codes, casi imcomprehensible pour moi et essai de faire le tri sans 'foutre' le bordel sur le forum.
J'usqua ce post ou je me dit, Pierre raconte ta vie.
Voila donc la situation, le probleme et l'explication de mes post.
Je donne donc ma question :
Comment Initialiser "hwnd" ?
Merci.
Comment initialiser hwnd ?Citation:
Envoyé par miron
En créant une fenêtre comme cela t'a déjà été dit.
Ou en l'initialisant à NULL comme cela t'a déjà été dit aussi.
Concernant ma dernière question ("C'est à dire ?"), elle se rapporte à "cela ne fonctionne pas".
Attention : j'ai bien écrit qu'elle se rapportait à "cela ne fonctionne pas". Elle ne se rapportait pas à "cela ne compile pas".
Cela suppose donc que tu as déjà compilé ton programme (sans warning). Cela suppose aussi que tu as déjà essayé de le lancer.
Là, puisque tu dis que " cela ne fonctionne pas", c'est que :
- soit cela ne fait rien sans aucun message d'erreur ;
- soit cela fait autre chose que ce que tu veux sans aucun message d'erreur ;
- soit une erreur est affichée.
Si cela ne fait rien : dire "quand je le lance, rien ne se passe" est déjà plus précis que "cela ne fonctionne pas".
Si cela fait autre chose que ce qui est prévu, dire "cela fait XXX et YYY au lieu de ZZZ" est plus précis qu'un simple "cela ne fonctionne pas".
Si un message d'erreur s'affiche, donner le message d'erreur est plus précis que "cela ne fonctionne pas".
Voilà ce que voulait dire mon "C'est à dire ?".
Pour reprendre l'analogie de mon précédent message : le docteur te demande où tu as mal et de quel type de douleur il s'agit et quand tu la sens, etc.
Ben là, c'est pareil.
Donc, au départ, tu nous dis : "cela ne fonctionne pas".
Maintenant, tu nous dis que tu n'arrives même pas à compiler ton programme correctement.
Il y a eu comme une régression entre les deux, non ?
D'après ce que j'ai dit au début de ce message, tu devrais être capable de compiler ton programme correctement (sans warning).
Alors lance-le.
Si cela ne fonctionne pas, note tous les éléments possibles concernant ce dysfonctionnement (messages d'erreur, etc) et décris correctement ce qui se passe en mettant une copie de ton code ici.
Quand je dis "une copie de ton code", il faut comprendre : un programme complet (compilable sans avoir besoin d'autre chose qu'un compilateur) et minimal (pas un truc de 30000 lignes).
Ok ?
Pas de description détaillée et/ou pas de code complet et minimal == sans moi.
J'aurais pu te dire qu'on pouvait mettre NULL pour le parametre hwnd mais j'ai preferé te dire que parfois les parametres de l'api windows n'étaient pas obligatoires et qu'on pouvait y mettre NULL
Cela pour te forcer à lire la doc, c'était pas compliqué, c'est ecrit noir sur blancCitation:
Envoyé par Gruik
Mais peut être tu sais pas lire l'anglais, auquel cas je te conseille de t'y mettre, justement pour etre capable de lire les docs.Citation:
hwnd
[in] Handle to the owner window used for displaying a user interface (UI) or error messages. This value can be NULL if the operation is not associated with a window (c'est ton cas).
Mais en fait je comprend pas créer une fenetre, mais lorsqon double clic sur un programme on a pas besoin de creer une fenetre !!Citation:
Envoyé par David.Schris
La je ne comprend deja pas en fait la necessité.Avec NULL je ne vois rien!!!Citation:
Ou en l'initialisant à NULL comme cela t'a déjà été dit aussi.
Enfin Peu importe d'un coté et puis d'un autre non.
Si j'ai bien compris il faut que je mette ceci :?Code:
1
2
3
4
5 HWND hwnd; hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hinstance, NULL);
Pourquoi sans Warning, un code avec Warning fonctionne souvent, le plus simple exemple est un void main !!Le compilo dit toujours : main return int !Citation:
Concernant ma dernière question ("C'est à dire ?"), elle se rapporte à "cela ne fonctionne pas".
Attention : j'ai bien écrit qu'elle se rapportait à "cela ne fonctionne pas". Elle ne se rapportait pas à "cela ne compile pas".
Cela suppose donc que tu as déjà compilé ton programme (sans warning).
Alors que a la base on ma dit de metre Void !!!Citation:
Cela suppose aussi que tu as déjà essayé de le lancer.
Là, puisque tu dis que " cela ne fonctionne pas", c'est que :
- soit cela ne fait rien sans aucun message d'erreur ;
- soit cela fait autre chose que ce que tu veux sans aucun message d'erreur ;
- soit une erreur est affichée.
Si cela ne fait rien : dire "quand je le lance, rien ne se passe" est déjà plus précis que "cela ne fonctionne pas".
Si cela fait autre chose que ce qui est prévu, dire "cela fait XXX et YYY au lieu de ZZZ" est plus précis qu'un simple "cela ne fonctionne pas".
Si un message d'erreur s'affiche, donner le message d'erreur est plus précis que "cela ne fonctionne pas".
Voilà ce que voulait dire mon "C'est à dire ?".
Pour reprendre l'analogie de mon précédent message : le docteur te demande où tu as mal et de quel type de douleur il s'agit et quand tu la sens, etc.
Ben là, c'est pareil.
Donc, au départ, tu nous dis : "cela ne fonctionne pas".
Maintenant, tu nous dis que tu n'arrives même pas à compiler ton programme correctement.
Il y a eu comme une régression entre les deux, non ?
D'après ce que j'ai dit au début de ce message, tu devrais être capable de compiler ton programme correctement (sans warning).
Alors lance-le.
Si cela ne fonctionne pas, note tous les éléments possibles concernant ce dysfonctionnement (messages d'erreur, etc) et décris correctement ce qui se passe en mettant une copie de ton code ici.
Quand je dis "une copie de ton code", il faut comprendre : un programme complet (compilable sans avoir besoin d'autre chose qu'un compilateur) et minimal (pas un truc de 30000 lignes).
Ok ?
Pas de description détaillée et/ou pas de code complet et minimal == sans moi.
Voila mes essai :
Et la :Code:
1
2
3
4
5
6
7 int main() { HWND hwnd; ShellExecute(hwnd,"open","Laby_Instal.exe",NULL,NULL,SW_HIDE); return 0; }
Citation:
Envoyé par Compilateur
Et la :Code:
1
2
3
4
5
6
7
8
9
10 int main() { HWND hwnd; HINSTANCE hinstance; hwnd = CreateWindow("MaWinClass", "Titre", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, 400, 300, NULL, NULL, hinstance, NULL); ShellExecute(hwnd,"open","Laby_Instal.exe",NULL,NULL,SW_HIDE); return 0; }
Citation:
Envoyé par Compilateur
QUe faire ?
:arf:
Il faut que tu declares un main() à la windows, l'un des parametres est le "hinstance"
Quand on cree un projet win32 avec vc++, on nous le met ce main particulier.
Mais sinon, normalement t'as pas besoin de creer une fenetre, ça marche pas quand tu mets NULL?
Et bien en fait apres plusieurs essais je sais pas pourquoi mais ca fonctionne effectivement...Citation:
Envoyé par Gruik
:aie:
:arf: :sm: :merci: :resolu:
Avec Dev-C++ aussi, il me semble :)Citation:
Envoyé par Gruik
Son prototype est le suivant :Une petite doc. : "API Windows en C / 1 - La fenêtre principale"Code:int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE PrevInstance, LPSTR lpCmdLine, int nCmdShow);
Merci pour le lien je croi que je vais m'en servir pour des applications futur !!Citation:
Envoyé par David.Schris
:merci:
A l'avenir je ne daignerai même pas te lire... Ce n'est pas la première fois que je trouve ton attitude déplorable sur ce forum... Mais bon ce n'est pas une affaire de C, mais de politesse...Citation:
Envoyé par miron
Ce n'aitais pas mechant du tout, c'aitais que en fait pour lparameter NULL fonctionnais et que ton code meme sil aitais expliquais étais pour moi quand meme incomprehensible.Citation:
Envoyé par Pikwik
Donc j'étais rasurais lorsque j'ai su que lparameters ne deandais rien d'autre que NULL !
Il est vrai et on me le dit que lorsque je dit qqc je le dit d'une facon qui veux pas tj direce que je veux dire, donc bon...
Je ne penssais pas etre aussi mal vu sur ce forum, et essai et essairais de mameliorer, et de redonne rune plus belle image au pseudo miron.
Profites-en pour améliorer ton ortographe et ta grammaire car, là, j'ai vraiment eu du mal à lire ton message (comprendre : cette fois, j'ai fait l'effort e le faire...à l'avenir, je ne sais pas si je le ferai).Citation:
Envoyé par miron
PS : se ke jeu di n'ais pa maichen du tou, c'ais juste un consseille.