Accueil > Forum > > > > Compatibilité de ShellExecuteEx sur Vista ??
Compatibilité de ShellExecuteEx sur Vista ??
samedi 2 février 2008 à 18:58:01 |
Compatibilité de ShellExecuteEx sur Vista ??

SlideHorn
|
Bonjour à tous. Je développe un logiciel sous VisualC++ et j'ai besoin de lancer une page web silencieusement puis la fermer ensuite pour ne pas laisser plein de processus inutile. j'utilise donc la fonction ShellExecuteEx avec SHELLEXECUTEINFO ExecInfo; memset(&ExecInfo, 0, sizeof(ExecInfo)); ExecInfo.lpFile = "C:\\Program Files\\Internet Explorer\\iexplore.exe"; ExecInfo.cbSize = sizeof(ExecInfo); ExecInfo.lpVerb = "open"; ExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; //permet d'obtenir le Handle pour le fermer ensuite ExecInfo.nShow = SW_HIDE; //pour ouvrir silencieusement ExecInfo.lpParameters = (LPCTSTR) l_Parametres; //en parametre l'adresse web à ouvrir ExecInfo.lpDirectory = NULL;
// et pour fermer la fenetre: TerminateProcess(ExecInfo.hProcess,0);
Alors cela fonction très bien sous Windows XP tant dis que sous Vista la fenetre s'ouvre "normalement" et elle ne se ferme pas lors de l'appel de TerminateProcess !
Je cherche donc un moyen que cela fonctionne sous XP et Vista. Merci d'avance pour vos lumieres 
|
|
samedi 2 février 2008 à 20:31:07 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

BruNews
|
ExecInfo.lpDirectory = NULL; Ne sert à rien, deja eu memset avant.
ShellExecuteEx ne garantit pas de retourner un hProcess, c'est indiqué dans MSDN. Comme IE a changé depuis XP, tu tombes justement sur ce cas.
Il faut utilmiser CreateProcess.
ciao... BruNews, MVP VC++
|
|
lundi 4 février 2008 à 14:43:02 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

SlideHorn
|
Bonjour,
sur les conseils de BruNews, j'ai utilisé CreateProcess comme suit:
STARTUPINFO si; ZeroMemory( &si, sizeof(si) ); si.cb = sizeof(si); si.dwFlags = STARTF_USESHOWWINDOW; //pour utiliser le wShowWindow si.wShowWindow = SW_HIDE; //pour ouvrir silencieusement
PROCESS_INFORMATION pi; ZeroMemory( &pi, sizeof(pi) );
CreateProcess( NULL, "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" http://www.cppfrance.com"
, NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &si, &pi);
CString error; //juste pour voir si une erreur est générée error.Format("CreateProcess failed (%d)\n", GetLastError() ); AfxMessageBox(error);
TerminateProcess(pi.hProcess,0); CloseHandle(pi.hThread);
Alors ces quelques lignes de code fonctionne sous XP (le processus est créé silencieusement puis fermé ensuite, comme je le souhaite) mais ne fonctionne toujours pas sous Vista (la fenetre s'ouvre normalement et ne se ferme pas)
Si quelqu'un à une solution je l'écoute avec impatience 
|
|
lundi 4 février 2008 à 18:27:48 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

BruNews
|
Réponse acceptée !
Déjà il faut bannir TeminateProcess, c'est pour les cas d'urgence mais pas en situation normale comme ici, le dossier TEMP des utilisateurs de tes progs te remerciera de ne pas le polluer. Suffit d'envoyer un WM_CLOSE pour fermer proprement.
FULL exemple avec une vulgaire dialog IDD_APP et un bouton IDCANCEL de fermeture. En fermant TA dialog, ça fermera le process IE créé par ta dialog. Testé XP et Vista, prog de 3Ko.
#define _WIN32_WINNT 0x0600 #define _WIN32_IE 0x0700 #include <windows.h> #include "resource.h"
HWND hie = 0; char pszcmd[] = "\"C:\\Program Files\\Internet Explorer\\iexplore.exe\" http://cppfrance.com";
BOOL CALLBACK EnumWindIeProc(HWND hwnd, LPARAM lParam) { char szclass[8]; if(GetWindowThreadProcessId(hwnd, 0) != (DWORD)lParam) goto defRET; if(7 != GetClassName(hwnd, szclass, 8)) goto defRET; if(*((DWORD*) szclass) != 'rFEI') goto defRET; // IEFrame hie = hwnd; return 0; defRET: return 1; // POUR CONTINUER }
int __stdcall LanceIE() { PROCESS_INFORMATION pi; STARTUPINFO si; DWORD *pdw, n; pi.dwProcessId = 0; pi.dwThreadId = 0; pi.hProcess = 0; pi.hThread = 0; pdw = (DWORD*) &si; n = sizeof(STARTUPINFO) / 4; do { *pdw++ = 0; } while(--n); si.cb = sizeof(STARTUPINFO); si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; if(!CreateProcess(0, pszcmd, 0, 0, 0, 0, 0, 0, &si, &pi)) return 0; CloseHandle(pi.hThread); CloseHandle(pi.hProcess); Sleep(500); EnumWindows(EnumWindIeProc, (LPARAM) pi.dwThreadId); return (int) hie; }
BOOL CALLBACK AppDlgProc(HWND hdlg, UINT mssg, WPARAM wParam, LPARAM lParam) { switch(mssg) { case WM_INITDIALOG: SetClassLongPtr(hdlg, GCLP_HICON, (long)LoadIcon(0, IDI_APPLICATION)); if(!LanceIE()) goto dlgEND; return 1; case WM_COMMAND: if(wParam != IDCANCEL) break; PostMessage(hie, WM_CLOSE, 0, 0); dlgEND: EndDialog(hdlg, 0); } return 0; }
#pragma comment(linker, "/entry:myWinMain") __declspec(naked) void __stdcall myWinMain() { __asm { push 0 call dword ptr GetModuleHandle push eax push offset AppDlgProc push 0 push IDD_APP push eax call dword ptr DialogBoxParam push 0 call dword ptr ExitProcess } }
ciao... BruNews, MVP VC++
|
|
lundi 4 février 2008 à 19:22:19 |
Re : Compatibilité de ShellExecuteEx sur Vista ??
|
lundi 4 février 2008 à 19:49:44 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

BruNews
|
Ne t'intéresse que le LanceIE().
Le reste c'est pour ceux qui codent sans surcouches interprétatives. Mon exe de 3 Ko peut se refiler à nimporte qui tel quel, il tourne à tout coup alors qu'avec MFC il faut un setup pour poser les runtime, une vraie plaie.
ciao... BruNews, MVP VC++
|
|
lundi 4 février 2008 à 20:10:51 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

SlideHorn
|
alors j'ai plusieurs choses qui apparaissent qui m'empeche de compiler: 1) warning C4005: '_WIN32_IE' : macro redefinition C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\commctrl.h(17) : see previous definition of '_WIN32_IE' ca à la limite ce n'est pas grave, si tu as une soluce pour éviter de l'avoir an warning à chaque fois... pour info la première définition est #define _WIN32_IE 0x0400
2) error C2660: 'PostMessageA' : function does not take 4 parameters là c'est assez ennuyeux, en effet l'assistant me propose: PostMessage(UINT message, WPARAM wParam, LPARAM lParam) où j'indique "hie" ??
3) error C2664: 'EnumWindows' : cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)' None of the functions with this name in scope match the target type et là l'erreur parle d'elle meme, mais je vois pas comment satisfaire le compilateur ?
Merci encore pour te pencher sur mon problème.
|
|
lundi 4 février 2008 à 20:17:01 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

SlideHorn
|
ok d'ac pour ces infos, je n'avais pas vu ton post pendant que j'écrivais le miens
mais subsiste quand meme le problème d'envoyer un message à IE ?? mon post avec mes erreurs compilateur reste d'actualité
|
|
mardi 5 février 2008 à 00:11:38 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

SlideHorn
|
pour l'erreur compilateur 3) error C2664: 'EnumWindows' : cannot convert parameter 1 from 'int (struct HWND__ *,long)' to 'int (__stdcall *)(struct HWND__ *,long)' None of the functions with this name in scope match the target type j'ai trouvé le remède, c'est que par reflexe, la fonctionBOOL CALLBACK EnumWindIeProc(HWND hwnd, LPARAM lParam) ecrite dans le .cpp je l'ai déclaré dans le .h et il ne faut pas (à priori) le faire pour ce type de fonction, car je n'ai plus cette erreur lorsque je ne la déclare pas dans le .h.
il me reste toujours les 2 autres (voir post de 20h10) que je ne trouve pas de réponse
|
|
mardi 5 février 2008 à 00:14:42 |
Re : Compatibilité de ShellExecuteEx sur Vista ??

BruNews
|
Faut préfixer les appels API par :: pour expliquer au compilo que tu veux appeler la vraie fonction du système, pas celle wrappée par MFC. Ex: ::PostMessage(hie, WM_CLOSE, 0, 0); idem pour le reste.
#define _WIN32_WINNT 0x0600 ça tu devrais pouvoir t'en passer ici, sinon faut voir où est situé le #include <windows.h> dans stdafx.h peut-être et en ce cas ça se met la ligne au dessus.
ciao... BruNews, MVP VC++
|
|
Cette discussion est classée dans : vista, compatibilité, fermer, execinfo, shellexecuteex
Répondre à ce message
Sujets en rapport avec ce message
Compatibilité Windows Vista [ par HeavenForsaker ]
Bonjour,Jaimerai savoir que faut il implémenter dans les application XP pour les rendre compatible Vista, apparement la majorité des api XP sont utili
compatibilité Borland C - Turbo C avec Windows Vista [ par cyas7 ]
Je voudrai savoir si c possible de developper avec borland c (ou turbo c++) sous windows vista , avec clavier "azerty" et en plein ecran , parcque l'e
Compatibilité "inter-windows" avec visual c++ express 2008 [ par AzrYel ]
Bonjour à tous!Je débute dans l' utillisation de visual studio 2008 notament visual c++ express edition (en français) et j' ai un problême de compatib
Migration driver USB de XP vers VISTA [ par durandalus ]
Bonjour à tous !Je suis entrain de travailler sur une migration d'une liste de drivers de disques USB d'XP vers VISTA et je voudrais bien qu'on me fil
Dev Cpp et Vista ?!? [ par zut69 ]
Bonsoir,Je programme en C sous dev-Cpp et Windows Vista. Pour pouvoir le faire, j'avais d'ailleurs dû faire quelques manipulations. Alors pour exécute
Compatibilité DLL [ par cherwam07 ]
BonjourJ'aurai besoin de votre aide sur un problème concernant les DLL.Je travail en C, j'ai créé une DLL avec devc++.Donc quelque chose comme :dll.h#
Installer Mysql sur windows vista [ par lenny_anis ]
J'essaie d'installer mysql v 5.0 sur windows vista sans succèes. J'ai vu sur le net certaines instructions pour y parvenir: To install MySQL Server 5.
Compatibilié de version d'une application sous vista avec XP [ par veresty ]
Bonjour à tousj'ai crée une application avec visual studio 2008 pro edition française sous vista.j'ai rajouté une version de ma dll qui se met bien à
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|