Bueno, un ejemplo es obtener la ruta o el nombre del archivo y que se devuelva el proceso (en tal caso que se este ejecutando).
estuve buscando en Google pero en este caso no encontre nada. >:( >:( >:(
La busqueda de el Foro no me arrojo ningún resultado :(
Se puede hacer que se listen todos los procesos, se haya la ruta de cada proceso y se compare con la ruta que necesitas, con archivo te referis a ejecutables no?
bueno, yo tengo la medio idea de como hacer el code, si queres lo posteo, pero no es lo que pedis. (El code que pienso es listar los procesos y devolver ruta).
Saludos ;)
Lo que sucede es que no es asi es al reves.
Tu dices:
Hallar procesos
Devolver la ruta
Yo digo:
Obtener la ruta
Hallar proceso de la ruta obtenida
De todas formas postea el codigo tal vez me sirve. ;)
Bueno, lo que dije fue que no tenia la respuesta jajaj, pero idee una alternativa, y ya la habia posteado, primero se listan los procesos, los nombres o rutas de los procesos, y luego se compara con alguna string a ver si el proceso esta activo.
checa este codigo, hasta el momento solo llevo la parte del nombre del ejecutable, si queres hago el de la ruta completa
Option Explicit
Private Const LETRAS As String = "abcdefghijklmnoñpqrstuvwxyz[].1234567890"
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 * 260
End Type
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Sub Command1_Click()
Dim hSnapShot#, ProcesoC#, ResP#, ProcesoC2#, R#, uProcess As PROCESSENTRY32
hSnapShot = CreateToolhelp32Snapshot(&H2, 0&)
uProcess.dwSize = Len(uProcess)
R = Process32First(hSnapShot, uProcess)
Do While R
If LCase$(Limpiar(uProcess.szExeFile)) = LCase$(Text1.Text) Then
MsgBox "Programa ejecutandose"
Exit Sub
End If
R = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Sub
Private Function Limpiar(proceso$)
Dim i%
For i = 1 To Len(proceso)
If InStr(1, LETRAS, Mid(proceso, i, 1), vbTextCompare) = 0 Then
proceso = Replace(proceso, Mid(proceso, i, 1), "")
End If
Next i
Limpiar = proceso
End Function
en text1.text metes el proceso que queres buscar, por ejemplo "notepad.exe"
saludos y espero que te sirva ;)
hola hades, bueno por lo que veo y lo rapido que respondes eres una persona muy instruida en vb 6, te felicito, ahora yo tengo una duda con respecto a esto de los procesos:
con el codigo anterior, si quisiera saber el numero de identificacion que se le asigna a cada proceso, como lo sabria?
ademas, como lo compararia si la aplicacion es abierta mas de una vez, y como es logico van a tener numeros de identificacion de procesos diferentes, espero me haya explicado, saludos
Cita de: abel_c_b en 25 Octubre 2007, 21:28 PM
ahora yo tengo una duda con respecto a esto de los procesos:
con el codigo anterior, si quisiera saber el numero de identificacion que se le asigna a cada proceso, como lo sabria?
En la estructura PROCESSENTRY32 hay un campo llamado th32ProcessID.
Para comparar si la aplicación está abierta más de una vez, tenes dos vias, la primera es comparar nombres de los procesos, y la segunda añadir al código algo como:
w = Limpiar(uProcess.szExeFile)
Text1.Text = Text1.Text & vbCrLf & w & " - " & uProcess.th32ParentProcessID
En el bucle donde se inicia la búsqueda de los procesos.
El th32ParentProcessID, sirve para indicar cual es el proceso padre de una aplicación, este te podría servir para observar si la aplicación esta abierta más de una vez.
Saludos ;)
Una breve acotacion: el parent no es 100% confiable ya que los PIDs se reciclan.
Cita de: Eternal Idol en 26 Octubre 2007, 08:03 AM
Una breve acotacion: el parent no es 100% confiable ya que los PIDs se reciclan.
Por eso dije que se podian tomar dos vías, la primera comparar el nombre del proceso, aunque esta también es insegura, y la del parent id. Pensandolo mejor, se podría programar algo para que según el proceso me devuelva la ruta de donde se está ejecutando el programa, así, se podría comparar un proceso con diferente id.
Saludos ;)
Cita de: HaDeS, - en 26 Octubre 2007, 22:03 PM
se podría programar algo para que según el proceso me devuelva la ruta de donde se está ejecutando el programa.
Justo lo que yo quiero.!! ;) ;) ;)
PD: Se adueñaron de mi Post xD xD xD
En ese caso podes recurrir a Module32First (el primer modulo siempre es el ejecutable) y el campo szExePath de la estructura MODULEENTRY32. Sino tambien GetModuleFileNameEx ...
Disculpame, podrias aclararme bien como hacelo...?
Espero que no sea una molestia :(
Cita de: ►Freeze en 27 Octubre 2007, 00:04 AM
Disculpame, podrias aclararme bien como hacelo...?
Espero que no sea una molestia :(
La primera forma es exactamente igual que Process* solo que mas simple, no necesitas enumerar todos los modulos, el que te interesa es el primero.
Para la segunda necesitas abrir un HANDLE al proceso (OpenProcess) y despues pasarle a GetModuleFileNameEx ese handle como primer parametro, cero como segundo, un puntero a cadena como tercero y el tamaño de la misma como cuarto y ultimo.
Hace muchos años que no programo en VB asi que te doy una descripcion teorica, para la primera forma te podes guiar con el codigo que esta arriba, sigue la misma logica.
De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(
Cita de: ►Freeze en 27 Octubre 2007, 00:15 AM
De este tipo de Apis no se mucho, no entiendo como obtener el Handle. :( :( :(
Si usas Module32First no necesitas ningun HANDLE.
Encontre este codigo, pero no me da la ruta completa:
Private Type MODULEENTRY32
dwSize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Long
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * 260
End Type
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, uProcess As MODULEENTRY32) As Long
Private Sub Form_Load()
Dim uProcess As MODULEENTRY32
Form1.AutoRedraw = True
lProcessID = GetCurrentProcessId
hSnapshot = CreateToolhelp32Snapshot(8, 0)
uProcess.dwSize = Len(uProcess)
n = Module32First(hSnapshot, uProcess)
Do While n
Form1.Print Left(uProcess.szModule, InStr(uProcess.szModule, Chr(0)) - 1)
n = Module32Next(hSnapshot, uProcess)
Loop
End Sub
Usa szExePath no szModule.
Gracias.
I love You..! xD
Editado: Este es mi Código::
Private Declare Function EnumProcesses Lib "psapi.dll" (ByRef lpidProcess As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal Handle As Long) As Long
Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
Private Sub Command1_Click()
Dim Procesos() As Long, cb&, cb2&, cbNeeded&, Ret&, Proceso&, Modulos(1 To 200) As Long, Elementos&, NombrePath$
cb = 16
cbNeeded = 96
Do While cb <= cbNeeded
cb = cb * 2
ReDim Procesos(cb / 4)
EnumProcesses Procesos(1), cb, cbNeeded
Loop
Elementos = cbNeeded / 4
For i = 1 To Elementos
Proceso = OpenProcess(1024 Or 16, 0, Procesos(i))
If Proceso <> 0 Then
Ret = EnumProcessModules(Proceso, Modulos(1), 200, cb2)
If Ret <> 0 Then
NombrePath = Space(260)
GetModuleFileNameExA Proceso, Modulos(1), NombrePath, 500
If Procesos(i) <> GetCurrentProcessId Then
NombrePath = Replace(Replace(NombrePath, "\systemroot\", "c:\windows\", , , vbTextCompare), "\??\", "")
Text1.Text = Text1.Text & vbCrLf & NombrePath
Text1.Text = Text1.Text & " - " & Procesos(i)
End If
End If
End If
CloseHandle Proceso
Next
End Sub
Saludos!
Editado: Para que el código te quede bien funcional, minimamente tenes que usar las apis, EnumProcess, OpenProcess, EnumProcessModules y GetModuleFileNameExA, porque si quitas por ejemplo EnumProcessModules, en el text1.text algunas lineas quedarían vacias y el resultado sería pésimo.
De nada ►Freeze, para la segunda forma no necesitas usar mas que OpenProcess y GetModuleFileNameEx con 0 como el segundo parametro, ya que como indica la documentacion:
hModule
[in] Handle to the module. If this parameter is NULL, GetModuleFileNameEx returns the path of the executable file of the process specified in hProcess.
Por cierto si necesitas trabajar con servicios habilita el privilegio SE_DEBUG_NAME primero.