|
Postada em 15/05/2006 16:14 hs
Olá, Tem como verificar se executável está na memória e caso esteja "matar" este processo da memória, porém sem usar KILL? Não posso usar esta rotina abaixo, pois este KILL só vem mesmo com windows nt: Call Shell("kill " & strNomeArqv, vbHide) Preciso disto pra que rotina de update de arquivos não dê erro ao atualizar arquivos que estão sendo usados no momento da atualização.
http://www.vilmarbro.com.br
|
TÓPICO EDITADO
|
|
|
|
|
Ama
|
UBERLÂNDIA MG - BRASIL
|
|
Postada em 15/05/2006 20:20 hs
de uma olhada na API Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Se souber o nome de exe lpclass = vbnullstring , lpwindowname nome exe resultado <> 0 encontrou handle do exe = exe aberto
Problema solucionado = click no cadeado para post encerrado!!!!!!!!!
|
|
|
|
Postada em 15/05/2006 22:54 hs
Abaixo tem dois exemplos para encerrar processos em aberto.
a) Encerrando processo quando se conhece o caption da janela. Public Const WM_CLOSE = &H10
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub CloseProgram(ByVal Caption As String) Dim Handle As Long Handle = FindWindow(vbNullString, Caption) If Handle = 0 Then Exit Sub SendMessage Handle, WM_CLOSE, 0&, 0& End Sub
b) Encerrando processo quando se conhece o nome do executável: Option Explicit
Public Const TH32CS_SNAPPROCESS As Long = 2& Public Const MAX_PATH As Long = 260
Public 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 * MAX_PATH End Type
Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" _ (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Public Declare Function ProcessMin Lib "kernel32" _ Alias "Process32Min" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function ProcessNext Lib "kernel32" _ Alias "Process32Next" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Public Declare Function TerminateProcess Lib "kernel32" _ (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Public Declare Sub CloseHandle Lib "kernel32" _ (ByVal hPass As Long)
Public Function CloseProcess(EXEName As String) As Boolean
Dim hSnapShot As Long Dim uProcess As PROCESSENTRY32 Dim hProcess As Long
CloseProcess = False hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) If hSnapShot = -1 Then Exit Function
uProcess.dwSize = Len(uProcess) If ProcessMin(hSnapShot, uProcess) = 1 Then Do If LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, vbNullChar) - 1)) = LCase$(EXEName) Then hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) CloseProcess = TerminateProcess(hProcess, ByVal 0&) > 0 Exit Do End If Loop While ProcessNext(hSnapShot, uProcess) End If
Call CloseHandle(hSnapShot) End Function
|
|
|
|
Postada em 16/05/2006 10:26 hs
Oi, Eu precisaria mesmo era da dica 2 sendo que: Eu uso windows xp pro e meu deu este erro abaixo: Run-time error '453: Can't find DLL entry point Process32Min in kernel32 Eu procurei tb. a definição da API Declare ProcessMin usando o programa API Viewer, mas nada achei! Eu teria que instalar esta API? Grato
http://www.vilmarbro.com.br
|
|
|
|
Postada em 16/05/2006 11:58 hs
Opssss, foi um erro na postagem, devo ter dado replace de "Min" por "Min" antes de postar o exemplo, abaixo esta o exemplo corrigido. a) Encerrando processo quando se conhece o caption da janela. Public Const WM_CLOSE = &H10
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Public Sub CloseProgram(ByVal Caption As String) Dim Handle As Long Handle = FindWindow(vbNullString, Caption) If Handle = 0 Then Exit Sub SendMessage Handle, WM_CLOSE, 0&, 0& End Sub
b) Encerrando processo quando se conhece o nome do executável: Option Explicit
Public Const TH32CS_SNAPPROCESS As Long = 2& Public Const MAX_PATH As Long = 260
Public 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 * MAX_PATH End Type
Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF
Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" _ (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Public Declare Function ProcessMin Lib "kernel32" _ Alias "Process32Min" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function ProcessNext Lib "kernel32" _ Alias "Process32Next" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Public Declare Function TerminateProcess Lib "kernel32" _ (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Public Declare Sub CloseHandle Lib "kernel32" _ (ByVal hPass As Long)
Public Function CloseProcess(EXEName As String) As Boolean
Dim hSnapShot As Long Dim uProcess As PROCESSENTRY32 Dim hProcess As Long
CloseProcess = False hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) If hSnapShot = -1 Then Exit Function
uProcess.dwSize = Len(uProcess) If ProcessMin(hSnapShot, uProcess) = 1 Then Do If LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, vbNullChar) - 1)) = LCase$(EXEName) Then hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) CloseProcess = TerminateProcess(hProcess, ByVal 0&) > 0 Exit Do End If Loop While ProcessNext(hSnapShot, uProcess) End If
Call CloseHandle(hSnapShot) End Function
|
TÓPICO EDITADO
|
|
|
|
|
Postada em 16/05/2006 12:48 hs
Estou postando novamente a edição do tópico tá bem doido!!! Opssss, foi um erro na postagem, devo ter dado replace de "Min" por "Min" antes de postar o exemplo, abaixo esta o exemplo corrigido. a) Encerrando processo quando se conhece o caption da janela. Public Const WM_CLOSE = &H10 Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Sub CloseProgram(ByVal Caption As String) Dim Handle As Long Handle = FindWindow(vbNullString, Caption) If Handle = 0 Then Exit Sub SendMessage Handle, WM_CLOSE, 0&, 0& End Sub b) Encerrando processo quando se conhece o nome do executável: Option Explicit Public Const TH32CS_SNAPPROCESS As Long = 2& Public Const MAX_PATH As Long = 260 Public 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 * MAX_PATH End Type Public Const PROCESS_ALL_ACCESS As Long = &H1F0FFF Public Declare Function CreateToolhelp32Snapshot Lib "kernel32" _ (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Public Declare Function ProcessMin Lib "kernel32" _ Alias "Process32Min" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function ProcessNext Lib "kernel32" _ Alias "Process32Next" _ (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long Public Declare Function OpenProcess Lib "kernel32" _ (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _ ByVal dwProcessId As Long) As Long Public Declare Function TerminateProcess Lib "kernel32" _ (ByVal hProcess As Long, ByVal uExitCode As Long) As Long Public Declare Sub CloseHandle Lib "kernel32" _ (ByVal hPass As Long) Public Function CloseProcess(EXEName As String) As Boolean Dim hSnapShot As Long Dim uProcess As PROCESSENTRY32 Dim hProcess As Long CloseProcess = False hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&) If hSnapShot = -1 Then Exit Function uProcess.dwSize = Len(uProcess) If ProcessMin(hSnapShot, uProcess) = 1 Then Do If LCase$(Left$(uProcess.szExeFile, InStr(1, uProcess.szExeFile, vbNullChar) - 1)) = LCase$(EXEName) Then hProcess = OpenProcess(PROCESS_ALL_ACCESS, False, uProcess.th32ProcessID) CloseProcess = TerminateProcess(hProcess, ByVal 0&) > 0 Exit Do End If Loop While ProcessNext(hSnapShot, uProcess) End If Call CloseHandle(hSnapShot) End Function
|
|
|
|