Newsgroup: it.comp.lang.visual-basic
Titolo: OpenProcess fallisce

Scusate ma proprio non riesco a capire che c'č che non va nel codice
riportato in seguito.....praticamento lHandle č uguale a zero e non riesco a
capire perchč.
Spero che qualcuno possa aiutarmi.
Grazie.
Option Explicit
Const SYNCHRONIZE = &H100000
Const PROCESS_QUERY_INFORMATION = &H400
Const PROCESS_ALL_ACCESS = &H1F0FFF
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle
As Long, ByVal dwMilliseconds As Long) As Long
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
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess
As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Sub Command1_Click()
    Dim lngHndl As Long
    Dim lRet As Long
    Dim lHandle As Long
 
    lngHndl = ShellExecute(Me.hwnd, "open", "winword", "", "", 1)
    If lngHndl > 0 Then
        lHandle = OpenProcess(PROCESS_ALL_ACCESS, False, lngHndl)
        lRet = WaitForSingleObject(lngHndl, 0)
    End If
End Sub
--------------------------------
Inviato via 
http://usenet.libero.it

capire perchč.
[cut sul codice]
Il codice in se' va (su windows 2000 pro).
Se lHandle ti vale zero allora prova a leggere il valore di
Err.LastDllError, oppure a chiamare GetLastError(), cosi' dal codice
di errore puoi avere informazioni in piu'.
Il fallimento puo' dipendere dall'assenza di winword sul pc target,
dal fatto che winword non sia nel path, dalla mancanza di permesso per
eseguirlo, ecc. ecc. 
Conoscere il codice di errore in questi casi e' certo utile, cosi'
come sapere anche la versione di sistema operativo.
-- 
ciao, hal

 ciao, hal
Ciao grazie per l'interessamento, ho trovato il problema, io pensavo che
ShellExecute restituisse l'handle dell'operazione, invece restituisce solo
un codice per gestire errori.
A questo punto però mi viene da chiedere come sia possibile che il codice da
te provato funzioni....
Nel codice da me scritto, lHandle dovrebbe essere uguale a 0 perchè il
parametro che io passo alla openprocess non è il valore dell'handle di word.

parametro che io passo alla openprocess non è il valore dell'handle di word.
Vero. Io pero' avevo capito che non ti fallisse ShellExecute invece di
OpenProcess, sicche' mi sono limitato a lanciare il codice per vedere
se partiva word.
A te serve, quindi, la ShellExecuteEx, che ritorna TRUE o FALSE in
caso di successo/fallimento, come nell' esempio che segue:
<codice>
Option Explicit
Private Const SEE_MASK_NOCLOSEPROCESS = &H40&
Private Const SW_NORMAL = 1&
Private Const INFINITE = &HFFFF
Private Type SHELLEXECUTEINFO
    cbSize As Long
    fMask As Long
    hwnd As Long
    lpVerb As String
    lpFile As String
    lpParameters As String
    lpDirectory As String
    nShow As Long
    hInstApp As Long
    '  Optional fields
    lpIDList As Long
    lpClass As String
    hkeyClass As Long
    dwHotKey As Long
    hIcon As Long
    hProcess As Long
End Type
Private Declare Function ShellExecuteEx Lib "shell32.dll" (ByRef sei
As SHELLEXECUTEINFO) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal
hHandle As Long, ByVal dwMilliseconds As Long) As Long
Public Sub Main()
    If (Test(0&, "winword")) Then
        MsgBox "Word e' terminato"
    End If
End Sub
Private Function Test(ByVal hwnd As Long, ByVal filePath As String) As
Boolean
    Dim sei As SHELLEXECUTEINFO 'Filling SEI structure
    With sei
    .cbSize = Len(sei)
    .fMask = SEE_MASK_NOCLOSEPROCESS
    .lpFile = filePath
    .lpVerb = "open"
    .nShow = SW_NORMAL
    .lpDirectory = Left$(filePath, (InStrRev(filePath, "")) - 1)
    .hwnd = hwnd
    End With
 
    If (ShellExecuteEx(sei)) Then
        WaitForSingleObject sei.hProcess, INFINITE
        Test = True
    End If
End Function
</codice>
-- 
ciao, hal


Appunto, questo č un esempio di come si debba prima consultare BENE MSDN e
poi postare il problema....
chiedo scusa :))))
Ciao e ancora grazie.