Torna al Thread
<DllImport("kernel32.dll")> _
Private Shared Function OpenProcess(ByVal dwDesiredAccess As ProcessAccessRights, ByVal bInheritHandle As Boolean, ByVal dwProcessId As Integer) As IntPtr
End Function
<DllImport("kernel32.dll")> _
Private Shared Function QueryFullProcessImageName(ByVal hProcess As IntPtr, ByVal dwFlags As UInt32, ByVal lpExeName As StringBuilder, ByRef lpdwSize As Integer) As Boolean
End Function
<DllImport("kernel32.dll")> _
Private Shared Function CloseHandle(ByVal hObject As IntPtr) As Boolean
End Function
<Flags()> _
Private Enum ProcessAccessRights
PROCESS_CREATE_THREAD = 2
PROCESS_QUERY_INFORMATION = &H400
PROCESS_QUERY_LIMITED_INFORMATION = &H1000
PROCESS_VM_OPERATION = 8
PROCESS_VM_READ = &H10
PROCESS_VM_WRITE = &H20
End Enum
Private Function GetProcessesPaths(ByVal processName As String) As String()
'Ottiene i processi in base al nome
Dim processes As Process() = Process.GetProcessesByName(processName)
'Crea l'array del risultato
Dim result(processes.Length - 1) As String
'Itera fra i processi trovati
For i As Integer = 0 To processes.Length - 1
'Ottiene l'handle di sistema per il processo
Dim handle As IntPtr = OpenProcess(ProcessAccessRights.PROCESS_QUERY_INFORMATION, False, processes(i).Id)
'La dimensione massima del percorso
Dim sz As Integer = &H200
'Crea uno stringBuilder che riceverà il nome del processo
Dim sb As New StringBuilder(sz)
'Ottiene il percorso completo del processo
QueryFullProcessImageName(handle, 0, sb, sz)
'Imposta il percorso nell'array
result(i) = sb.ToString()
'Rilascia l'handle del processo
CloseHandle(handle)
Next i
'Ritorna il risultato
Return result
End Function