Nuevas NORMAS para el foro

Curso Hacker
Bienvenido(a), Visitante. Favor de ingresar o registrarse. - Mayo 16, 2008, 10:05:00
Boton Buscar
Inicio Ayuda Calendario Ingresar Registrarse
Visita: Articulos - Juegos Gratis - Da Foros

Comunidad Underground Hispana  |  Programacion  |  Programación  |  Visual Basic y Net (Moderador: Tughack)  |  Tema: El Mutex en Visual Basic 0 Usuarios y 1 Visitante están viendo este tema. « anterior próximo »
Páginas: [1] Ir Abajo Imprimir
Autor Tema: El Mutex en Visual Basic  (Leído 18 veces)
SOADER (ANYD00M)
Colaborador
*****
Desconectado Desconectado

Mensajes: 651


.:Beethoven's Count:.

maxigile_tl@hotmail.com
Ver Perfil Email
« en: Mayo 01, 2008, 06:39:30 »

Voy a explicarles mas o menos de que se trata esto del mutex y como se aplica a VB.

Comenzemos diciendo que el mutex es muy visto en virus y en troyanos, pero no te asustes, que no solo se utiliza para esto y no se trata de una funcion malevola.
El Mutex lo que hace es cargar en memoria un segmento de datos (unicos, por supuesto) que lo vincula con nuestra aplicacion. Asi podemos saber si nos estabamos esjecutando ya, o si no lo estabamos haciendo.
Seguramente te preguntaras ¿porque usar un mutex y no el objeto App que contiene la senencia PrevInstance?. Bien, yo me pregunte lo mismo la vez que lo conoci, pero dejenme decirles que el mutex es mas fiable y da mas profecionalismo a los codigos, cosa que los puede ayudar mucho en un futuro Wink
El unico inconveniente es que el mutex se carga en memoria, pero no se cierra cuando la apicacion lo hace, por ello puede ser una pro y una contra pues, pro porque podemos sabes si nuestra aplicacion ya se habia ejecutado alguna vez (claro que cuando se reinicie el sistema el mutex desaparecera de memoria), y la contra, y muy contra es que si no se descarga de memoria, al cerrar la aplicacion luego al volverla abrir se reconocera (es una muy contra si lo que queremos hacer es algo como "If App.PrevInstance = True then: End", ya que al iniciar la aplicacion se terminaria.
Asique veremos como cargar, y como y cuando descargar el mutex de memoria.
Para crear un Mutex se utiliza la api CreateMutex (bastante predecible ^^) y su declaracion es la siguiente:

Declaracion Publica:
Código: (vb)
Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Declaracion Privada:
Código: (vb)
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long

Y se utiliza de la siguiente manera:
Código: (vb)
Dim l as long
l = CreateMutex(MUTEX, 1, "Cadena_Unica_del_Mutex")

Porsupuesto nos acabamos de saltear otras cosas, como por ejemplo la variable "MUTEX". Esta variable va ser de un tipo definicido por el usuario (SECURITY_ATTRIBUTES). El mismo se declara asi:

Código: (vb)
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Y pues bien, a la variable MUTEX hay que declararla y aplicarle todos los datos:

Código: (vb)
Dim MUTEX as SECURITY_ATTRIBUTES
MUTEX.bInheritHandle = 1
MUTEX.lpSecurityDescriptor = 0
MUTEX.nLength = Len(MUTEX)

Bueno, ordenemos todo Tongue
Lo que vamos a hacer es una aplicacion que se inicie solo una vez, voy a exponer el codigo y la explicacion de la linea estara encima de ella:

Código: (vb)
'Declaramos la API CreateMutex
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByRef lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
'Creamos la estructura de datos SECURITY_ATTRIBUTES
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Sub Form_Load()
Dim MUTEX As SECURITY_ATTRIBUTES
Dim l as long
'Aplicamos datos a la variable MUTEX
MUTEX.bInheritHandle = 1
MUTEX.lpSecurityDescriptor = 0
MUTEX.nLength = Len(MUTEX)
'Creamos un mutex que carga "CADENA_UNICA_DEL_MUTEX en memoria _
 aplicando la variable delcarada anteriormente con sus valores _
 correspondiente.
'Luego de que se cree, l contendra el handle del mutes, que nos _
 ayudara a cerrar el mutex para descargarlo de memoria.
l = CreateMutex(MUTEX, 1, "CADENA_UNICA_DEL_MUTEX")
End Sub

Bueno, con eso tenemos creado el mutex, ahora acomodaremos el codigo un poco, agregaremos una constante de CreateMutex que indicara que el mutex esta cargado, es decir que la aplicacion se esta ejecutando. Asique lo que haremos sera obtener igualarlo con una condicion If para saber si nos estabamos ejecutando, y si es asi nos cerraremos:

Código: (vb)
'Declaramos la API CreateMutex
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByRef lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
'Declaramos la constante:
Private Const ERROR_ALREADY_EXISTS = 183
'Creamos la estructura de datos SECURITY_ATTRIBUTES
Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Sub Form_Load()
Dim MUTEX As SECURITY_ATTRIBUTES
Dim l as long
'Aplicamos datos a la variable MUTEX
MUTEX.bInheritHandle = 1
MUTEX.lpSecurityDescriptor = 0
MUTEX.nLength = Len(MUTEX)
'Creamos un mutex que carga "CADENA_UNICA_DEL_MUTEX en memoria _
 aplicando la variable delcarada anteriormente con sus valores _
 correspondiente.
'Luego de que se cree, l contendra el handle del mutes, que nos _
 ayudara a cerrar el mutex para descargarlo de memoria.
l = CreateMutex(MUTEX, 1, "CADENA_UNICA_DEL_MUTEX")
'Igualamos la constante y verificamos con un If, si el mutex esta _
 cargado (si l aaplicacion esta iniciada)
If Err.LastDllError = ERROR_ALREADY_EXISTS Then: End
End Sub

Bueno, puedes probar el codigo, pero te recomiendo que esperes, porque a continuacion explicare como descargar el mutex de memoria para poder volver a iniciar la aplicacion. Y es que si tu pruebas el codigo asi, lo que sucedera sera que al cerrar por completo la aplicacion ya no la podras abrir mas, asique vamos!:

Lo que haremos ahora sera lo ultimo, en la seccion Form_Unload() (Cuando la aplicacion se este cerrando, pero no funciona si se cierra forzosamente, ojo con eso.) colocaremos una llamada a la API CloseHandle que cerrara el mutex, pasandole como valor la variable "l" que contiene el handle del mutex.
Antes que nada, declaramos la API..

Delcaracion Publica:
Código: (vb)
Public Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long

Declaracion Privada:
Código: (vb)
Private Declare Function CloseHandle Lib "kernel32" Alias "CloseHandle" (ByVal hObject As Long) As Long

Y luego agregamos la llamada al Form_Unload():

Código: (vb)
Private Sub Form_Unload(Cancel As Integer)
'Llamamos a la funcion CloseHandle pasandole _
 como argumento el handle del mutex y de esta _
 manera cerraremos el mutex descargandolo de _
 memoria y permitiendo la proxima ejecucion de _
 nuestra aplicacion.
Call CloseHandle(l)
End Sub

Bueno, ahora hay que notar una cosa, es diferente la prueba que l arealidad.. Es decir, cuando lo estemos depurando desde el Visual Basic seguramente nos romperemos la cabeza para sacarlo de memoria, y es que eso es lo que me paso :S
Asique lo que vana a hacer es compilarlo y probarlo compilado Wink

A esto hay gente que l ecuesta agarrarle la mano, cuando yo empece a probar, sacaba concluciones falsas, como que siempre al probarlo desde VB me daba que estaba abierto, pero o recien lo abria y pensaba que era por el Mutex se crea antes de probar si esta abierto ono, pero en realidad no era por eso. Y la comprobacion se hace comparando el actual mutex con el antiguo Wink (para que no les pase Tongue)
Bueno, ese codigo a mi me funciono, asique esta testeado y no tiene fallos  Cheesy

Les dejo un saludo y espero les halla gustado, es que no es algo comun usar un mutex para esto en VB ya que se usa el App.PrevInstance y no tiene m,ucho sentido, pero el Mutex es aplicable a lengages coo C o C++ que no posees el objeto App.
En línea


Para ver los enlaces debes ser usuario Crear Usuario o Hacer Sesion
Páginas: [1] Ir Arriba Imprimir 
Comunidad Underground Hispana  |  Programacion  |  Programación  |  Visual Basic y Net (Moderador: Tughack)  |  Tema: El Mutex en Visual Basic « anterior próximo »
Ir a:  
Novedades, Dudas, Comentarios Y Sugerencias, Top 100, Off-Topic, Revista E-Zine, Revista E-Zine, Sistemas operativos libres. , HacK GeneraL, Phreaking, Bug y Exploits, Networking & Wireless, Overclocking, Refrigeracion y demas, Hardware, Electronica Y Robotica, Hack para newbies, Todo Messenger, Troyanos y virus, Programacion, Programacion para webmasters, Software, Cracks & Serialz, P2p, Bittorrent, Elinks, Diseño Grafico, Juegos PC, Mp3, Multimedia, Peliculas Divx, Juegos, Humor y Adultos. (Diversion), Paginas Webs Recomendadas, Videos,


Zona-Musical Juegos online Juego Gratis10 Solucion Hosting Videos De Musica 1juegogratis Dragonjar
Noticias
 Juegos De Coche juegos gratis online juegos Los Foros De Sexe Gratuit Sexo Duro Tierra Messenger Trucos
Ranking-Hits
Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC