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
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
0