Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Gorky en 26 Marzo 2006, 15:02 pm



Título: Abrir solo dos instancias de mi programa
Publicado por: Gorky en 26 Marzo 2006, 15:02 pm
Buenas a todos. Si nosotros queremos que al ejecutar nuestro programa se nos abra otra vez podemos poner en el FormLoad
Código:
Shell(app.path & "\" & app.exename & ".exe")
Sin embargo al abrirse nuevamente volveria a abrir otra instancia de si mismo y asi hasta tener el mismo programa infinitas veces en ejecucion.
Pero yo lo que quiero es tener solo dos ejecuciones del mismo, una la que yo ejecuto manualmente y otra la que se ha abierto despues. Espero me puedan ayudar con esto.


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: Robokop en 26 Marzo 2006, 19:32 pm
Y si no lo pones en el formload y lo pones en un command o condicionas un evento para que se ejecute otra vz


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: NYlOn en 26 Marzo 2006, 19:38 pm
Podes usar la API FindWindow y si se encuentran 2 ventanas con el titulo de tu form que no se ejecute nuevamente el programa.

Saludos.-


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: Gorky en 27 Marzo 2006, 09:00 am
Y si no lo pones en el formload y lo pones en un command o condicionas un evento para que se ejecute otra vz

He de ponerlo en el FormLoad y no en un boton ya que necesito que su ejecucion sea transparente para el usuario y que no necesite de la intervencion del mismo.
Es obvio que necesito una condicion pero no se cual.

Podes usar la API FindWindow y si se encuentran 2 ventanas con el titulo de tu form que no se ejecute nuevamente el programa.

Esta podria ser una buena condicion pero creo que para mi programa no serviria ya que sus ventanas estarian ocultas. Es mas, no tienen ni ventanas, solo modulos.

Alguna otra sugerencia mas?


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: LeandroA en 27 Marzo 2006, 11:49 am
busca en los procesos si encontras mas de dos pues end


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: LaN en 27 Marzo 2006, 15:58 pm
el metodo que yo utilizaria seguro q es el peor pero yo escribiria en un archivo.txt las veces q esta abierto y si es >= 2 pues end x'D


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: Gorky en 27 Marzo 2006, 16:02 pm
el metodo que yo utilizaria seguro q es el peor pero yo escribiria en un archivo.txt las veces q esta abierto y si es >= 2 pues end x'D

Eso mismo lo habia pensado pero en su version mas... profesional. ;) Y seria escribiendo en el registro cuando el primero abre, y cuando el segundo lo lea que no abra y borre lo escrito.


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: LaN en 27 Marzo 2006, 16:09 pm
That's the ticket ;D


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: LeandroA en 27 Marzo 2006, 19:52 pm
hola estamos ablando de dos corriendo, no tres ni uno, ni mas si decimos una entonese utilizamos el app.instanse, pero ablamos de dos para que no se abra un tercero no???
y con lo que decian del archivo de texto o el registro, esto traeria una complicacion que si el programa se cuelga y hay que cerrarlo forzado pues seguramente el archvio o el registro quedaria incompleto (firgurarian dos mientras que posiblemnete aya uno o ninguno)
entonces lo recomendable es contar en los procesos cuantas veces figura el exe


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: Gorky en 27 Marzo 2006, 20:12 pm
Ahi esta, con dos cojones, defendiendo tu idea!!! ;D
Bromas a parte, llevas razon. En este mismo instante no se como leer los procesos en ejecucion pero se que se puede hacer y se donde buscar. Otra cosa: crees que podre seguir esa idea si uso taskbar.hide = false?


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: LeandroA en 27 Marzo 2006, 20:37 pm
te paso el code, fijate que para que funcione primero tenes que generar el exe

Código:
Option Explicit
Const TH32CS_SNAPHEAPLIST = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPTHREAD = &H4
Const TH32CS_SNAPMODULE = &H8
Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Const TH32CS_INHERIT = &H80000000
Const MAX_PATH As Integer = 260
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 * MAX_PATH
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 Form_Load()
Comprovar
End Sub

Sub Comprovar()
Dim hSnapShot As Long, uProcess As PROCESSENTRY32, r As Long, Contador As Integer
hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
uProcess.dwSize = Len(uProcess)
r = Process32First(hSnapShot, uProcess)
Dim Proceso As String
Do While r
Proceso = Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
If UCase(App.EXEName & ".exe") = UCase(Proceso) Then
Contador = Contador + 1
If Contador > 2 Then End
End If
r = Process32Next(hSnapShot, uProcess)
Loop
CloseHandle hSnapShot
End Sub


Título: Re: Abrir solo dos instancias de mi programa
Publicado por: Ironhorse en 28 Marzo 2006, 00:29 am
Otra opcion es pasarle como parametro al ejecutable la cantidad de instancias que se van llamando:

Código:
Private Instancias As Long

Private Sub Form_Load()
  Instancias = Val(Command)
  Instancias = Instancias + 1
  If Instancias < 2 Then
   Shell (App.Path & "\" & App.EXEName & " " & Instancias)
  End If
End Sub


Saludos