Power Builder - Solucion para eliminar procesos de memoria

 
Vista:

Solucion para eliminar procesos de memoria

Publicado por Rosanna (1 intervención) el 23/08/2007 13:24:54
Hola

Os dejo este truco para matar un proceso de memoria. En xp funciona, no se si en otros Windows lo hara. Yo lo he utilizado para eliminar el acrobat de memoria tras visualizar un documento pdf. Lo he encontrado por ahi, en una página en chino, japonés o similar. Espero que sea útil.

Declarar como funciones externas:

FUNCTION Long CreateToolhelp32Snapshot(Long dwFlags,Long th32ProcessID) LIBRARY "KERNEL32.DLL"
FUNCTION Long CloseHandle(Long hObject) LIBRARY "KERNEL32.DLL"
FUNCTION Long TerminateProcess(Long hProcess,Long uExitCode) LIBRARY "KERNEL32.DLL"
FUNCTION Long OpenProcess(Long dwDesiredAccess,Long bInheritHandle,Long dwProcessId) LIBRARY "KERNEL32.DLL"
FUNCTION Long GetLastError() LIBRARY "KERNEL32.DLL"
FUNCTION Boolean Process32First(Long hSnapshot,REF PROCESSENTRY32 lppe) LIBRARY "KERNEL32.DLL"
FUNCTION Boolean Process32Next(Long hSnapshot,REF PROCESSENTRY32 lppe) LIBRARY "KERNEL32.DLL"

Declarar la estructura PROCESSENTRY32:
unsignedlong dwsize
unsignedlong cntusage
unsignedlong th32processid
unsignedlong th32defaultheapid
unsignedlong th32moduleid
unsignedlong cntthreads
unsignedlong th32parentprocessid
unsignedlong pcpriclassbase
unsignedlong dwflags
character szexefile[260]

function integer uf_kill_proceso (string nombre_proceso)
// Creación funcion que elimina un proceso de memoria.
// 0 si ok
// -1 si error

CONSTANT Long TH32CS_INHERIT = 2147483648
CONSTANT Long TH32CS_SNAPALL = 19
CONSTANT Long TH32CS_SNAPHEAPLIST = 1
CONSTANT Long TH32CS_SNAPMODULE = 8
CONSTANT Long TH32CS_SNAPPROCESS = 2
CONSTANT Long TH32CS_SNAPTHREAD = 4
CONSTANT Long INVALID_HANDLE_VALUE = -1
CONSTANT Long PROCESS_TERMINATE = 1

string exefile
Long ll_hSnapshot,ll_th32ProcessID
Long u_pid, hwdprocess
PROCESSENTRY32 lpe_ProcessEntry

SetNull (ll_th32ProcessID)

ll_hSnapshot = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,
ll_th32ProcessID)

IF ll_hSnapshot > 0 THEN
lpe_processentry.dwSize = 296
IF Process32First (ll_hSnapshot, lpe_ProcessEntry) THEN
DO
IF Trim(String (lpe_processentry.szExeFile)) = "AcroRd32.exe" THEN
u_pid = lpe_processentry.th32ProcessID
END IF
LOOP WHILE Process32Next (ll_hSnapshot, lpe_ProcessEntry)
END IF
CloseHandle (ll_hSnapshot)
END IF

IF u_pid = 0 THEN RETURN -1

hwdprocess = OpenProcess (PROCESS_TERMINATE, 1, u_pid)
IF hwdprocess = 0 THEN RETURN -1

IF TerminateProcess (hwdprocess, 0) <> 0 THEN RETURN 0

RETURN -1
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Solucion para eliminar procesos de memoria

Publicado por Manuel Coca (1 intervención) el 11/06/2008 22:37:48
tengo un problema en la sgte linea de comando:
IF Trim(String (lpe_processentry.szExeFile)) = "AcroRd32.exe" THEN

Al hacer el debug ese IF nunca se cumple por tanto no ejecuta el comando que sigue: u_pid = lpe_processentry.th32ProcessID

Porfa si alguien sabe porque el lpe_processentry.szExeFile nunca toma el valor de "AcroRd32.exe" pese a que SI esta activo en memoria..
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucion para eliminar procesos de memoria

Publicado por Juan Carlos (1 intervención) el 20/07/2008 18:52:14
Parece q la funcion no pide el nombre del proceso osea "AcroRd32.exe" sino quiere el PID osea el identificador de proceso. que son numeros de 4 digitos como max. para ver el pid de un proceso haces lo siguiente.
ejecutar ---> cmd
luego pones "tasklist" (sin comillas) y enter
devolvera una lista de procesos y al costado sus PID respectivos.

NOTA: el problema de terminar procesos con sus PID, es q los PID cambian osea varian cada ves q se ejecute el programa. ejemplo: abres el notepad.exe te sale PID 1452 lo cierras el notepad y lo vuelves a abrir y esta ves su PID ssera 2545. a eso me refiero.

te recomiendo buscar otra funcion para poder terminar el proceso con el nombre de la imagen osea "AcroRd32.exe" esa funcion es mas poderosa pero no la conosco =D

Ojala te haya ayudado un poko =D
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Solucion para eliminar procesos de memoria

Publicado por Juan Larreinegabe (1 intervención) el 17/02/2009 14:52:40
tocayo, con el administrador de tareas de windowsXp vas a 'ver' 'seleccionar columnas' despues identificador de procesos, y lo tenes. Lo que decis es muy cierto, estos numeros de identificacion cambian, pero el codigo que nos paso este usuario (gracias!!) ya resuelve cual es el PID con solo pasarle el nombre ;).

IF Trim(String (lpe_processentry.szExeFile)) = nombre_proceso THEN

el nombre del proceso es el argumento de la funcion!!!!

espero que les funcione tan bien como me funciono a mi, Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar