USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Fórum

  Visual Basic
Voltar
Autor Assunto:  Como verificar se executável está na memória?
vilmarbr
Pontos: 2843
SAO PAULO
SP - BRASIL
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
Pontos: 2843
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!!!!!!!!!
     
Jose.Niz
CURITIBA
PR - BRASIL
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
     
vilmarbr
Pontos: 2843
SAO PAULO
SP - BRASIL
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
     
Jose.Niz
CURITIBA
PR - BRASIL
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
   
Jose.Niz
CURITIBA
PR - BRASIL
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
     
Página(s): 1/2      PRÓXIMA »


Seu Nome:

Seu eMail:

ALTERAR PARA MODO HTML
Mensagem:

[:)] = 
[:P] = 
[:(] = 
[;)] = 

HTML DESLIGADO

     
 VOLTAR

  



CyberWEB Network Ltda.    © Copyright 2000-2025   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página