CloseProgram et KillProgram ???

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

CloseProgram et KillProgram ???

Message par PhM »

Bonjour,
Je ne comprends pas l’utilisation de CloseProgram et KillProgram.
Je souhaite fermer le navigateur par défaut qui vient d'être correctement ouvert avec RunProgram (page$).
Comprenez-vous pourquoi cela ne fonctionne pas ?

Code : Tout sélectionner

page$ = "https://www.qwant.com/"
RunProgram (page$)

Delay(5000)

CloseProgram(page$)
KillProgram(page$)

Delay(5000)

End
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: CloseProgram et KillProgram ???

Message par doudouvs »

Bonjour,

CloseProgram() Cette commande ne force pas le programme à se terminer, seule la connexion avec lui est fermée. Pour forcer le programme à quitter, la commande KillProgram() est disponible. De plus, même si le programme se termine de façon normale, il est important d'appeler CloseProgram() pour libérer toutes les ressources.

c'est dans l'aide exemple : tu sélectionne avec la souri KillProgram puis la touche F1 et ta la doc


La du coup tu ferme ferme page$ c'est pas bon, il faut faire

Code : Tout sélectionner

out = RunProgram(page$)
CloseProgram(out)
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Merci pour ta réponse rapide. malheureusement, cela ne fonctionne pas et provoque une erreur :

[ERREUR] L'argument 'Program' spécifié n'est pas valide.

Code : Tout sélectionner

page$ = "https://www.qwant.com/"
out = RunProgram (page$)

Delay(5000)

CloseProgram(out)
KillProgram(out)

Delay(5000)

End
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: CloseProgram et KillProgram ???

Message par doudouvs »

Normal https://www.qwant.com n'est pas un program
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
doudouvs
Messages : 244
Inscription : jeu. 07/mars/2013 19:02
Localisation : France Alsace / Espagne Girona

Re: CloseProgram et KillProgram ???

Message par doudouvs »

sous Windows c'est surement un truc comme ça
RunProgram("iexplore.exe","http://www.purebasic.fr","")
GCC 7.4.0 / PureBasic 5.71 / Ubuntu 18.04.3 LTS
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Non, toujours une erreur "fatale" à la fermeture !

Code : Tout sélectionner


out = RunProgram ("Firefox.exe","http://www.purebasic.fr","")

Delay(5000)

CloseProgram(out)
KillProgram(out)

Delay(5000)

End

Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: CloseProgram et KillProgram ???

Message par Marc56 »

Il faut ouvrir un canal de communication avec le programme lancé pour pouvoir le fermer.

Code : Tout sélectionner

ID = RunProgram("iexplore.exe", 
                "http://www.purebasic.fr", 
                "", 
                #PB_Program_Open)
Delay(3000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Oui Marc56, cela fonctionne mais uniquement avec iexplorer.exe.

Le navigateur ne se ferme pas avec firefox.exe ou chrome.exe.

Code : Tout sélectionner

;prog$ = "chrome.exe"
;prog$ = "firefox.exe"
prog$ = "iexplore.exe"
page$ = "http://www.purebasic.fr"

ID = RunProgram (prog$,page$,"",#PB_Program_Open)

Delay(5000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf


End
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: CloseProgram et KillProgram ???

Message par Marc56 »

1. Firefox ou Chrome n'étant pas dans le PATH, il faut alors préciser le chemin complet
2. Il ne faut pas qu'il soit déjà ouvert

Code : Tout sélectionner

; Prog$ = "iexplore.exe", 
; Prog$ = "C:\Program Files\Mozilla Firefox\firefox.exe"
  Prog$ = "C:\Program Files (x86)\Google\Chrome\Application\chrome.exe"

ID = RunProgram(Prog$, 
                "http://www.purebasic.fr", 
                "", 
                #PB_Program_Open)
Delay(3000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Ok, merci Marc56, maintenant je comprends...

Et, pour info doudouvs, il n'y a aucun exemple dans "tu sélectionnes avec la souris KillProgram puis la touche F1 et tu as la doc".
En tout cas pour la version PureBasic 5.71 LTS (x64)

Merci à vous deux.
Philippe
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Finalement, même comme cela le code fonctionne avec les trois navigateurs :

Code : Tout sélectionner

;prog$ = "chrome.exe"
prog$ = "firefox.exe"
;prog$ = "iexplore.exe"

page$ = "http://www.purebasic.fr"

ID = RunProgram (prog$,page$,"",#PB_Program_Open)

Delay(5000)

If IsProgram(ID)
    KillProgram(ID)
    CloseProgram(ID)
EndIf

End
Néanmoins, maintenant j'ai une question en rapport direct :
Pour qu'un programme de ce type fonctionne, quelque soit le navigateur par défaut et sur toute machine.
Comment connaitre le navigateur par défaut d'une machine quelconque avant de lancer ID = RunProgram de l'exemple ci-dessus ?
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: CloseProgram et KillProgram ???

Message par Ar-S »

Salut,
Une piste.
Tu peux examiner le registre (cherche base de registre dans le forum) et regarder dans cette clé :

Code : Tout sélectionner

HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
La tu regardes la chaine : ProgId et tu vois le nom du navigateur.


Voilà un exemple, (code bdr extrait de la droopy libs je pense).
Je ne cherche que le mot firefox car c'est mon navigateur par defaut, mais je suppose que tu trouveras aussi chrome, IE... J'ai pas plus cherché que ça

Code : Tout sélectionner




#LIBRARY_VERSION="5.42.002"
  
#KEY_WOW64_64KEY=$100
#KEY_WOW64_32KEY=$200


Declare IsWow64Process()
Declare Wow64DisableWow64FsRedirection()
Declare Wow64RevertWow64FsRedirection()
Declare RegMode(Ex,Wow64)
Declare.s RegGetValue(Key.s, ValueName.s, ComputerName.s)


;&&&1 IsWow64Process
Procedure IsWow64Process() ;+++
  ;/// Determines whether the specified process is running under WOW64.
  ;/// Return TRUE if the process is running under WOW64.
  ;/// Return FALSE if the process is running under 32-bit Windows or if the process is a 64-bit application running under 64-bit Windows
  
  Lid = OpenLibrary(#PB_Any, "kernel32") 
  If Lid  
    CallFunction(Lid,"IsWow64Process",GetCurrentProcess_(),@ret) 
    CloseLibrary(Lid) 
    ProcedureReturn ret
  EndIf 
  
EndProcedure 

;&&&1 Wow64DisableWow64FsRedirection
Procedure Wow64DisableWow64FsRedirection() ;+++
  ;/// Disables file system redirection for the calling thread. File system redirection is enabled by default
  ;/// If the function succeeds, the return value is a nonzero value.
  ;/// If the function fails, the Return value is zero.
  ;/// Use RegMode() for accessing 64-bit key
  
  Shared Wow64OldValue
  
  If IsWow64Process()
    Lid=OpenLibrary(#PB_Any, "kernel32.dll")
    If Lid
      GetFunction(Lid,"Wow64DisableWow64FsRedirection")
      ret=CallFunction(Lid,"Wow64DisableWow64FsRedirection",@Wow64OldValue)
      CloseLibrary(Lid)
      ProcedureReturn ret
    Else  
      Debug "Unable to Open kernel32.dll"
      ProcedureReturn #False
    EndIf
  EndIf
  
EndProcedure

;&&&1 Wow64RevertWow64FsRedirection
Procedure Wow64RevertWow64FsRedirection() ;+++
  ;/// Restores file system redirection for the calling thread
  ;/// If the function succeeds, the return value is a nonzero value.
  ;/// If the function fails, the Return value is zero.
  
  Shared Wow64OldValue
  
  If IsWow64Process()
    Lid=OpenLibrary(#PB_Any,"kernel32.dll")
    If Lid
      ret=CallFunction(Lid,"Wow64RevertWow64FsRedirection",@Wow64OldValue)
      CloseLibrary(Lid)
      ProcedureReturn ret
    EndIf
  EndIf
  
EndProcedure


Enumeration
  #KEY_WOW64_64KEY=$100 ;//Resident
  #KEY_WOW64_32KEY=$200 ;//Resident
EndEnumeration

Procedure RegMode(Ex,Wow64) ;+++
  ;/// Set Registry access mode<br>
  ;/// <b>Ex</b> Use Extended Registry Functions
  ;/// #False (Default) use old Registry functions
  ;/// #True : Use 'New' Registry Functions (Some key cannot be viewed as simple user)<br>
  ;/// <b>Wow64</b> Access an Alternate Registry View
  ;/// By default, a 32-bit application running on WOW64 accesses the 32-bit registry view and a 64-bit application accesses the 64-bit registry view.
  ;/// The following flags enable 32-bit applications to access redirected keys in the 64-bit registry view and 64-bit applications to access redirected keys in the 32-bit registry view.
  ;/// These flags have no effect on shared registry keys.
  ;/// <b>#KEY_WOW64_64KEY</b> Access a 64-bit key from either a 32-bit or 64-bit application. (RegEx(#True) required)
  ;/// <b>#KEY_WOW64_32KEY</b> Access a 32-bit key from either a 32-bit or 64-bit application.
  ;/// <br><A href="http://msdn.microsoft.com/en-us/library/aa384253(v=VS.85).aspx">Registry Keys Affected by WOW64</A>
 
  Shared RegWow64.l,RegEx.l
  
  RegEx=Ex
  RegWow64=Wow64
  
EndProcedure

Procedure RegConvertRegKeyToTopKeyAndKeyName(Key.s) ; internl function
  
  Shared topKey,KeyName.s
  
  temp.s=StringField(Key,1,"\")
  temp=UCase(temp)
  Select temp
    Case "HKEY_CLASSES_ROOT"
      topKey=#HKEY_CLASSES_ROOT
    Case "HKEY_CURRENT_USER"
      topKey=#HKEY_CURRENT_USER
    Case "HKEY_LOCAL_MACHINE"
      topKey=#HKEY_LOCAL_MACHINE
    Case "HKEY_USERS"
      topKey=#HKEY_USERS 
    Case "HKEY_CURRENT_CONFIG"
      topKey=#HKEY_CURRENT_CONFIG 
  EndSelect
  
  PositionSlash=FindString(Key,"\",1)
  KeyName.s=Right(Key,(Len(Key)-PositionSlash))
  
EndProcedure

;&&&1 RegGetValue
Procedure.s RegGetValue(Key.s, ValueName.s, ComputerName.s) ;+++
  ;/// Gets a Value
  ;/// This function can only read #REG_SZ #REG_DWORD #REG_BINARY #REG_EXPAND_SZ types
  ;/// The #REG_BINARY type returns the value as a hex number
  ;/// Returns the value of the Key / Empty String if Value Name doesn't exist
  
  Shared RegWow64.l,RegEx,topKey,KeyName.s
  RegConvertRegKeyToTopKeyAndKeyName(Key)
  
  If ComputerName = "." 
    If RegEx
      GetHandle = RegOpenKeyEx_(topKey,KeyName,0,#KEY_ALL_ACCESS|RegWow64,@hKey)
    Else
      GetHandle = RegOpenKey_(topKey,KeyName,@hKey)
    EndIf
  Else 
    lReturnCode = RegConnectRegistry_(ComputerName, topKey, @lhRemoteRegistry) 
    If RegEx
      GetHandle = RegOpenKeyEx_(lhRemoteRegistry,KeyName,0,#KEY_ALL_ACCESS|RegWow64,@hKey) 
    Else
      GetHandle = RegOpenKey_(lhRemoteRegistry,KeyName,@hKey) 
    EndIf
  EndIf 
  
  If GetHandle = #ERROR_SUCCESS 
    lpcbData = 1024 
    lpData.s = Space(lpcbData) 
    
    GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
    
    If GetHandle = #ERROR_SUCCESS 
      
      Select Type 
        Case #REG_SZ 
          
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            GetValue.s = Left(lpData, lpcbData - 1) 
          Else 
            GetValue = "" 
          EndIf 
          
        Case #REG_EXPAND_SZ 
          
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @Type, @lpData, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Left(lpData, lpcbData - 1) 
          Else 
            GetValue = "" 
          EndIf 
          
          
          
        Case #REG_DWORD 
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @lpType, @lpDataDWORD, @lpcbData) 
          
          If GetHandle = 0 
            GetValue = Str(lpDataDWORD) 
          Else 
            GetValue = "0" 
          EndIf 
          
        Case #REG_BINARY 
          BinaryBytes=1024
          *RegBinary=AllocateMemory(BinaryBytes) 
          GetHandle = RegQueryValueEx_(hKey, ValueName, 0, @lType, *RegBinary, @BinaryBytes) 
          If GetHandle = 0 ; SUCCESs
            GetValue=""
            For i = 0 To (BinaryBytes-1 )
              Temp3=PeekB(*RegBinary+i)&$000000FF
              If Temp3<16 : GetValue+"0" : EndIf
              GetValue+ Hex(Temp3)
            Next 
            FreeMemory(*RegBinary)
          EndIf 
          
      EndSelect 
    EndIf 
  EndIf 
  RegCloseKey_(hKey) 
  ProcedureReturn GetValue 
EndProcedure 





Global key$ = "HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice\"
Catch.s = RegGetValue(Key$, "ProgId", ".")

If FindString(catch,"Firefox")
  Debug "Le navigateur par defaut est Firefox"
  ;ElseIf ....
  
EndIf

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
PhM
Messages : 118
Inscription : dim. 08/déc./2019 10:50

Re: CloseProgram et KillProgram ???

Message par PhM »

Salut Ar-s,

Effectivement cela fonctionne avec les trois navigateurs tester :

Code : Tout sélectionner

If FindString(catch,"Firefox")
  Debug "Le navigateur par defaut est Firefox"
ElseIf FindString(catch,"Chrome")
  Debug "Le navigateur par defaut est Chrome"
ElseIf FindString(catch,"IE")
  Debug "Le navigateur par defaut est IExplorer" 
EndIf
Mais, quelle débauche de moyens (listing de 220 lignes) pour avoir ce simple renseignement !
En tout cas, merci pour le tuyau.
Marc56
Messages : 2198
Inscription : sam. 08/févr./2014 15:19

Re: CloseProgram et KillProgram ???

Message par Marc56 »

Tu peux faire ça:

Code : Tout sélectionner

SetCurrentDirectory(GetTemporaryDirectory())
RunProgram("reg",  "export HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice cle.ini /y", "")
Puis analyser le fichier %temp%\cle.ini

ou directement (avec runprogram)

Code : Tout sélectionner

reg query HKEY_CURRENT_USER\Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice
et analyser le flux de sortie

reg /?
pour voir les autres possibilités.

:wink:
Avatar de l’utilisateur
Ar-S
Messages : 9540
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: CloseProgram et KillProgram ???

Message par Ar-S »

PhM a écrit :Salut Ar-s,
Mais, quelle débauche de moyens (listing de 220 lignes) pour avoir ce simple renseignement !
En tout cas, merci pour le tuyau.
Disons que la partie des proces est un code récurrent pour toutes les fois où tu auras besoin de lire dans le registre.
La version complète permet de lire, ecrire, lister etc et est donc bien plus longue. Là je t'ai filé le nécessaire.
Perso j'ai un dossier PROCE dans mes dossiers de code et je les appelle via un .PBI quand j'en ai besoin.
ça te parait être une débauche de code mais c'est tout de même une série de commandes pour aller fouiller dans le cerveau de windows :) C'est pas rien et au final, 200 lignes c'est pas grand chose.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre