Ya puse una alternativa hace un tiempo:
http://foro.elhacker.net/programacion_vb/srcmaltmutexbas_alternativa_a_createmutex-t243771.0.html
Pues aqui va otra trabajando con Semaforos :P
Option Explicit
'KERNEL32
Private Declare Function CreateSemaphoreW Lib "kernel32.dll" (ByVal lpSemaphoreAttributes As Long, ByVal lInitialCount As Long, ByVal lMaximumCount As Long, ByVal lpName As Long) As Long
Private Const ERROR_ALREADY_EXISTS As Long = 183&
Public Function bWasIOpened(ByVal lpName As String) As Boolean
bWasIOpened = (CreateSemaphoreW(0&, 0&, 1&, StrPtr(lpName)) > 0) And (Err.LastDllError = ERROR_ALREADY_EXISTS)
End Function
Minimalista, como a mi me gusta >:D
Bueno, para que no sepa para que sirve esto lo explico, es bastante facil.
Sirve para que no hayan dos instancias de nuestra aplicacion ejecutandose simultaneamente...
Una mejor explicacion de nuestro amigo MadAntrax :P
Cita de: ||MadAntrax|| en 19 Mayo 2007, 17:33 PM
sirve para controlar que nuestra aplicación no sea ejecutada 2 veces en un mismo equipo. Algunos pensareis que eso ya se puede hacer con
If App.PrevInstance = True Then End
pero eso no es cierto... si nuestra aplicación se copia en System32 como: programa1.exe y programa2.exe... el usuario podrá ejecutar el programa1.exe y el programa2.exe simultáneamente! Eso puede suponer un problema en el caso de estar programando un troyano o un keylogger (donde lo importante es solo tener una instancia de nuestro malware a la vez).
Ejemplo de uso del code:
Private Sub Form_Load()
If bWasIOpened("Cualquier_Cosa") = True Then End
End Sub
Nota:Probar solo compilado.
Saludos :D
If App.PrevInstance = True Or App.EXEName <> "Project1" Then End
:silbar:
Jajaja XD...
Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D
Cita de: Hasseds en 16 Marzo 2010, 16:22 PM
If App.PrevInstance = True Or App.EXEName <> "Project1" Then End
:silbar:
Creo que no has leido la cita que he hecho a MadAntrax...
Si se renombra el fichero y se vuelve a ejecutar el proceso eso no sirve para nada :)
Cita de: ssccaann43 en 16 Marzo 2010, 16:24 PM
Jajaja XD...
Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D
Gracias :-[ :xD :xD
Cita de: ssccaann43 en 16 Marzo 2010, 16:24 PM
Jajaja XD...
Karcrack como dice cobein... Sos un capo...! Me gustó este code...! ::D
+1 , tambien me gustó el code
Cita de: Karcrack en 16 Marzo 2010, 16:24 PM
Si se renombra el fichero y se vuelve a ejecutar el proceso eso no sirve para nada :)
Como que no sirve, si renombras (en la misma carpeta o ya está corriendo no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta
Cita de: Hasseds en 16 Marzo 2010, 16:33 PM
Como que no sirve, si renombras (en la misma carpeta o ya está corriendo no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta
1- No es buena idea 'hardcodear' un nombre (de carpeta o fichero, da igual), ya que eso es facilmente modificable...
2- Prueba a usar el metodo de app.PrevInstance haciendo esto:
Compila el ejecutable como "Proyecto1.exe" ejecutalo, ira sin problemas... copia el "Proyecto1.exe" a "Proyecto2.exe" y abrelo... veras que hay dos instancias de la misma aplicacion...
Cita de: Karcrack en 16 Marzo 2010, 16:38 PM
Cita de: Hasseds en 16 Marzo 2010, 16:33 PM
Como que no sirve, si renombras (en la misma carpeta o ya está corriendo no hay segunda instancia
PD: y app.path en el caso que se renombre en otra carpeta
1- No es buena idea 'hardcodear' un nombre (de carpeta o fichero, da igual), ya que eso es facilmente modificable...
2- Prueba a usar el metodo de app.PrevInstance haciendo esto:
Compila el ejecutable como "Proyecto1.exe" ejecutalo, ira sin problemas... copia el "Proyecto1.exe" a "Proyecto2.exe" y abrelo... veras que hay dos instancias de la misma aplicacion...
If App.PrevInstance = True
Or App.EXEName <> "Proyecto1" Then End
como va a abrir Proyecto2 si no es = a Proyecto1
Cita de: Hasseds en 16 Marzo 2010, 16:45 PM
If App.PrevInstance = True Or App.EXEName <> "Proyecto1" Then End
como va a abrir Proyecto2 si no es = a Proyecto1
Si, si, mientras uses esa condicion al cambiar el nombre se cerrará... pero te digo que no es buena idea, porque si cambias el nombre al EXE original... es decir, cambias el nombre al "Proyecto1" por incluso "PROYECTO1" dejara de ir.... Por eso no es buena idea :xD O si lo pusieses en un AutoExtraible del WinRar tampoco iria, porque a no ser que digas lo contrario el Winrar pone nombres aleatorios :D
hey genial Karcrack lo tomare como alternativa vere que otros metodos habra me has motivado xD... Salu2 y thankz ;)
Muy bueno Karcrack =D
@Hasseds, todo eso que pusiste se puede "saltar" por ejemplo copiando la app a otra unidad, mismo nombre etc y va a correr. Digamos que los semaforos o mutex son alternativas mas "globales"
Cita de: cobein en 16 Marzo 2010, 18:34 PM
Muy bueno Karcrack =D
@Hasseds, todo eso que pusiste se puede "saltar" por ejemplo copiando la app a otra unidad, mismo nombre etc y va a correr. Digamos que los semaforos o mutex son alternativas mas "globales"
Por supusto,
eso esta fuera de discucion, ya felicité a KK por el code en un post anterior, pero con las dos App que cité mas app.path en el mismo if se puede lograr una sola instancia.
Había leído en una ocasión sobre esta API ¬¬, pero no le tome atención :P
Gracias por el aporte, esta esta mejor que usar CreateMutex :D
SaluDOS!!!
Cita de: Sm0kes en 16 Marzo 2010, 17:49 PM
hey genial Karcrack lo tomare como alternativa vere que otros metodos habra me has motivado xD... Salu2 y thankz ;)
Hoy mismo antes de empezar con esto estaba pensando formas mas astutas :P Se me ha ocurrido, trabajar con Named Pipes, o trabajar con WM_USER... pero todo esto necesita bastante mas codigo.. y a mi me gustan las cosas minimalistas :)
Gracias a todos, me alegro que os haya gustado :D