begin process at 2012 05 28 18:47:53
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Windows

 > 

Shell

 > 

Compatibilité de ShellExecuteEx sur Vista ??


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

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

Administrateur CodeS-SourceS

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

Administrateur CodeS-SourceS
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 ??

SlideHorn

j'ai bien noté pour le TerminateProcess

merci pour le full exemple que je vais tenter d'intégrer à mon projet,
en attendant je vois qu'il faut fermer les CloseHandle(pi.hThread) et
  CloseHandle(pi.hProcess)... ET en plus envoyer un message via PostMessage d'où l'utilité du EnumWindIeProc,
admettons,
mais alors je comprends pas du tout pourquoi il y a de l'assembleur dans void __stdcall myWinMain()
quelques explications la dessus pourraient enrichir ma culture cppienne 
(surtout que je ne vois pas où je vais mettre ce morceau d'assembleur dans mon projet en MFC Dialog Based...)

Je te tiens au courant si j'ai réussi à intégrer tout ca dans mon projet.

lundi 4 février 2008 à 19:49:44 | Re : Compatibilité de ShellExecuteEx sur Vista ??

BruNews

Administrateur CodeS-SourceS
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 fonction
BOOL 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

Administrateur CodeS-SourceS
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++

1 2

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 à


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,120 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales