Après compilation: windows ne parvient pas à acceder au périphérique

Résolu
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013 - 4 janv. 2012 à 09:37
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013 - 4 oct. 2013 à 12:17
Bonjour!
j'ai un diaporama que je voulais lancer par un programme vb6 et qui se termine après 15 seconde.
le code est:
Private Sub Form_Load()
ShellExecute Me.hwnd, "open", "C:\Documents and Settings\gallo\Bureau\SARZEMAAA.ppsx", vbNullString, "C:\Documents and Settings\gallo\Bureau\SARZEMAAA.ppsx", SW_SHOWNORMAL
DoEvents
i = 0
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
i = i + 1
If i = 15 Then
KillProcessus "POWERPNT.exe"
End
End If
End sub

lancé sous vb6, tout marche correctement , mais après compilation, il y a une erreur de windows!
Et l'erreur est:

"Windows ne parvient pas à accéder au périphérique, au chemin d'accès ou au fichier spécifié. vous ne disposez peut-être pas des autorisations appropriées pour avoir accès à l'élément"

merci d'avance!

11 réponses

sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013
4 janv. 2012 à 09:40
j'ai deja cherché sur codes-sources mais personne n'a eu le même problème! est-ce que quelqu'un peut m'aider?
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
4 janv. 2012 à 10:43
Bonjour bonjour,

J'ai trouvé ça dans mon pense-bête API, qui sait...


************************************************************
OUVERTURE D'UNE APPLICATION
FERMETURE DE L'APPLICATION DEPUIS LE PROGRAMME QUI L'A LANCE
************************************************************
Private Declare Function OpenProcess Lib "kernel32" ( _
ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long _
) As Long
'
Private Declare Function TerminateProcess Lib "kernel32" ( _
ByVal hProcess As Long, _
ByVal uExitCode As Long _
) As Long
Private Declare Function CloseHandle Lib "kernel32" ( _
ByVal hObject As Long) As Long
'
Private Const PROCESS_TERMINATE = &H1
Dim NumProcess As Long
Dim RC As Long
Dim hProcess As Long
'
Sub ouvrir()
NumProcess = Shell(Nom_fic, 1)
End sub
Sub fermer()
hProcess = OpenProcess(PROCESS_TERMINATE, -1&, NumProcess)
RC = TerminateProcess(hProcess, 0&)
RC = CloseHandle(hProcess)
End Sub


Cordialement, Joe.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
4 janv. 2012 à 10:44
Bonjour,
essaye ainsi :
ShellExecute Me.hwnd, vbNullString, "mailto:KPDTeam@Allapi.net", vbNullString, "C:\Documents and Settings\gallo\Bureau", SW_SHOWNORMAL

pour ce qui est de ton :
KillProcessus "POWERPNT.exe"

par contre ==>> impossible de te renseigner sans voir le code associé.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2012 à 10:46
Salut

Pour savoir quelle instruction génère cette erreur, il faut gérer les erreurs.
Voir :
On Error Goto

Une fois que tu sauras d'où provient l'erreur, on pourra éventuellement trouver la raison.

Que représente KillProcessus ?

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
4 janv. 2012 à 10:53
on error goto erreur
KillProcessus "POWERPNT.exe"
end
erreur:
msgbox(err & vblf & err.description)
on error resume next
0
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013
4 janv. 2012 à 14:20
merci pour vos réponse!

ucfoutu => ton shellexecute a marché sous vb6 mais en compilé windows sort toujours le message d'erreur

EhJoe et Jack => le "On error" ne donne rien parce que sous vb6, il n'y avait aucune d'erreur, et en compilé, il y a toujours ce satané message d'erreur

pour ce qui est du "killprocessus()", c'est un code que j'ai vu sur vbfrance, dans un module:

    'Attribute VB_Name = "processus"
    'Option Compare Database
    Option Explicit
    '----------------------------------------------------------------------------------------------------------'
    ' déclaration des types utilisés
    '----------------------------------------------------------------------------------------------------------'
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
    '----------------------------------------------------------------------------------------------------------'
    ' déclaration des types utilisés
    '----------------------------------------------------------------------------------------------------------'
    Const MAX_PATH As Integer = 260
    Private Type LUID
    LowPart As Long
    HighPart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
    pLuid As LUID
    Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
    PrivilegeCount As Long
    TheLuid As LUID
    Attributes As Long
    End Type
    Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szexeFile As String * MAX_PATH
    End Type
    '----------------------------------------------------------------------------------------------------------'
    ' Terminer un processus : fonction système à ne surtout pas comprendre !!
    '----------------------------------------------------------------------------------------------------------'
    Private Function ProcessTerminate(Optional lProcessID As Long, Optional lHwndWindow As Long) As Boolean
    Dim lhwndProcess As Long
    Dim lExitCode As Long
    Dim lRetVal As Long
    Dim lhThisProc As Long
    Dim lhTokenHandle As Long
    Dim tLuid As LUID
    Dim tTokenPriv As TOKEN_PRIVILEGES, tTokenPrivNew As TOKEN_PRIVILEGES
    Dim lBufferNeeded As Long
    Const PROCESS_ALL_ACCESS &H1F0FFF, PROCESS_TERMINAT &H1
    Const ANYSIZE_ARRAY 1, TOKEN_ADJUST_PRIVILEGES &H20
    Const TOKEN_QUERY &H8, SE_DEBUG_NAME As String "SeDebugPrivilege"
    Const SE_PRIVILEGE_ENABLED = &H2
    On Error Resume Next
    If lHwndWindow Then
    lRetVal = GetWindowThreadProcessId(lHwndWindow, lProcessID)
    End If
    If lProcessID Then
    lhThisProc = GetCurrentProcess
    OpenProcessToken lhThisProc, TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, lhTokenHandle
    LookupPrivilegeValue "", SE_DEBUG_NAME, tLuid
    tTokenPriv.PrivilegeCount = 1
    tTokenPriv.TheLuid = tLuid
    tTokenPriv.Attributes = SE_PRIVILEGE_ENABLED
    AdjustTokenPrivileges lhTokenHandle, False, tTokenPriv, Len(tTokenPrivNew), tTokenPrivNew, lBufferNeeded
    lhwndProcess = OpenProcess(PROCESS_TERMINAT, 0, lProcessID)
    If lhwndProcess Then
    ProcessTerminate = CBool(TerminateProcess(lhwndProcess, lExitCode))
    Call CloseHandle(lhwndProcess)
    End If
    End If
    On Error GoTo 0
    End Function
    '----------------------------------------------------------------------------------------------------------'
    ' trouver un processus en fonction de son nom placé en paramètre
    '----------------------------------------------------------------------------------------------------------'
    Public Function KillProcessus(ByVal sProcessNameExe As String) As String
    Dim i As Integer
    Dim hSnapshot As Long
    Dim uProcess As PROCESSENTRY32
    Dim r As Long
    Dim NOM(1 To 100)
    Dim num(1 To 100)
    Dim NR As Integer
    Const TH32CS_SNAPPROCESS As Long = 2&
    NR = 0
    hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) ' faire un instantané des processus s'executant au moment voulu
    If hSnapshot = 0 Then Exit Function ' si y'a pas alors ça sert à rien de continuer
    uProcess.dwSize = Len(uProcess) ' initialisation de uProcess
    r = ProcessFirst(hSnapshot, uProcess) ' on met dans r le premier processus rencontré
    Do While r ' faire tant que y'a des processus dans la liste
    NR = NR + 1 ' incrémentation de l'indice
    NOM(NR) = uProcess.szexeFile ' rempli le tableau de noms de processus
    num(NR) = uProcess.th32ProcessID ' rempli le tableau d'ID de processus
    r = ProcessNext(hSnapshot, uProcess) ' on essaie de passer au processus suivant
    Loop
    For i = 1 To NR ' pour tous les processus listés
    If InStr(UCase(NOM(i)), UCase(sProcessNameExe)) <> 0 Then ' si c le bon
    ProcessTerminate (num(i)) ' on le nique
    Exit For ' et on sort (à enlever si on veut tuer tous les processus du nom sProcessNameExe
    End If
    Next i
    End Function ' fin


désolé si c'est un peu long!
0
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013
4 janv. 2012 à 14:53
ucfoutu = > désolé mais j'ai eu un peu de retard pour le "mailto:KPDTeam@Allapi.net"

EhJoe = > je ne sais pas ce qui se passe mais le "OUVERTURE D'UNE APPLICATION
FERMETURE DE L'APPLICATION DEPUIS LE PROGRAMME QUI L'A LANCE" me lance toujours une erreur:"invalide procedure call or argument" qui pointe sur
NumProcess = Shell(Nom_fic, 1)
, mais normalement ça devrait marché non?
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
4 janv. 2012 à 15:49
sedera15

suite

Oui, normalement ça devrait marcher les zAPIs mais il y a mille ans que je n'ai pas utilisé ça, faudrait chercher les paramètres et voir si tout y est...

Sinon, mais je ne sais pas le faire, regarde le nom de ton processus, puis cherche comment le tuer depuis ton code avant de sortir, ça peut être une solution (faq VB sur FREE.FR ?) ...

A priori c'est une erreur du système... hum... tente de temporiser et de reboucler sur l'ordre de destruction, par exemple tois fois en trois secondes... parfois c'est le cerveau qui est lent, ça coûte rien d'essayer. Parce que c'est pas évident, les tâches ont des priorités, certaines sont synchronisées, d'autres pas... peut être qu'au moment où tu envoies l'ordre de destruction, il n'est pas en état de le recevoir, et il se perd dans la nature, je ne sais pas, je manque de compétence en ce domaine, désolé

Cordialement, Joe.
0
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013
4 janv. 2012 à 17:42
EhJoe, Jack, ucfoutu = > merci pour votre aide mais j'ai suivi un autre chemin, j'ai fait un batch avec comme contenu
taskkill /F /IM POWERPNT.exe
dans c: que j'ai appelé kill-her.bat
et dans la forme principale j'ai mis:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const SW_SHOWNORMAL = 1
Dim i As Long
Private Sub Form_Load()

ShellExecute Me.hwnd, "open", "C:\Documents and Settings\gallo\Bureau\SARZEMAAA.ppsx", vbNullString, "C:\Documents and Settings\gallo\Bureau\SARZEMAAA.ppsx", SW_SHOWNORMAL
DoEvents
i = 0
Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
i = i + 1
If i = 15 Then
Shell "c:\kill-her.bat", vbHide
End
End If
End Sub

et ça fonctionne en vb6 comme en compilé!

mais je vais quand même essayer de connaitre la source de l'erreur précédente, comme ça si ça se reproduit, je saurai déja ce que c'est!
tenez-moi au courant si vous le trouvez avant moi!

merci pour votre aide les gars
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 janv. 2012 à 19:53
"EhJoe et Jack => le "On error" ne donne rien parce que sous vb6, il n'y avait aucune d'erreur, et en compilé, il y a toujours ce satané message d'erreur"
La gestion d'erreur fonctionne (heureusement) autant en dev qu'en compilé.
Il est important que tu saches quelle instruction génère cette erreur pour trouver d'où cela vient.
Bien que ce ne soit plus dans les manuels, les lignes de code peuvent être numérotées et Erl renvoie le n° de la ligne.
Des utilitaires comme MzTools, gratuit pour VB6, permettent de générer et supprimer les n° de lignes d'une procédure ou d'un programme.
Il y a donc moyen de connaitre l'origine du problème.

Code de KillProcessus : Pouah! du code sans indentation, c'est imbuvable.

Voir aussi <cette source> qui permet d'identifier le processus qu'on lance.
0
sedera15 Messages postés 31 Date d'inscription vendredi 27 janvier 2012 Statut Membre Dernière intervention 4 octobre 2013
Modifié par sedera15 le 4/10/2013 à 12:27
bonjour! j'ai réussi à résoudre le problème et je vous remercie tous!
j'ai mis l'exe et le diapo dans le même dossier puis j'ai changer:
ShellExecute Me.hwnd, "open", "C:Documents and SettingsgalloBureauSARZEMAAA.ppsx", vbNullString, "C:Documents and SettingsgalloBureauSARZEMAAA.ppsx", SW_SHOWNORMAL

par
shell App & path &"SARZEMAAA.ppsx"

(il y a un back slash avant le SARZEMAAA mais çà s'affiche pas quand je valide ma réponse! bizaaaare)
et j'ai changer
KillProcessus "POWERPNT.exe"

par
shell "cmd taskkill /F /IM POWERPNT.exe", vbhide 'pour cacher la fenêtre DOS


conclusion
- je n'ai pas utilisé de d'API
- le DOS est toujours aussi utile ;-p

cordialement
0
Rejoignez-nous