elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Duda - Como restringir la aplicacion a una instancia?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda - Como restringir la aplicacion a una instancia?  (Leído 886 veces)
OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Duda - Como restringir la aplicacion a una instancia?
« en: 22 Febrero 2018, 18:08 »

buenas queria preguntarles cual es la forma mas adecuada a hacer esto, basicamente es que tengo una aplicacion hecha en vb.net winform y que lee archivos csv, la aplicacion esta asociada a la extension es decir que  al hacer doble clic sobre el archivo inicia y carga el contenido en mi aplicación, uno de los detalles es que si quiero abrir otro archivo se me abre la aplicacion otra ves y lo que quiero es que se abra solo en una.

Estaba leyendo por internet que esto se puede hacer mediante:

1) la api "SendMessage" es decir al iniciar y comprobar si el proceso esta activo y si lo esta  enviar los archivos que pasan Environment.GetCommandLineArgs()
y luego cerrar la aplicacion.
2)lo mismo que el anterior solo que en ves de verificar si el proceso esta activo usar MUTEX.
3)Hacerlo mediante el WindowsFormsApplicationBase, es decir   heredar una clase de WindowsFormsApplicationBase  estableciendo la propiedad IsSingleInstance  en TRUE.
4) Mediante: Dynamic Data Exchange (DDE) - (Esto si que no tengo mucha idea)

Cual de estas formas deberia usar??


Gracias


« Última modificación: 22 Febrero 2018, 18:36 por OscarCadenas_91 » En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Duda - Como restringir la aplicacion a una instancia?
« Respuesta #1 en: 22 Febrero 2018, 18:53 »

Duda - Como restringir la aplicacion a una instancia? 

Solo tienes que hacer un simple click en esta casilla...



Si estuvieramos hablando de C# entonces la cosa cambiaría, ya que a Microsoft y los devs. de Visual Studio les gusta complicarle la vida a los que programan en C#, jeje, lo apropiado sería crear (y apropiarse de) un MUTEX usando la clase Mutex.

Saludos!


« Última modificación: 22 Febrero 2018, 18:59 por Eleкtro » En línea


OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Duda - Como restringir la aplicacion a una instancia?
« Respuesta #2 en: 23 Febrero 2018, 00:59 »

muchas gracias por responder

pero aun me queda por resolver como capturar el archivo que intento abrir es decir ya no se abre otra ves pero no puedo obtener el nuevo archivo que intento abrir en mi aplicacion

En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Duda - Como restringir la aplicacion a una instancia?
« Respuesta #3 en: 23 Febrero 2018, 02:57 »

pero aun me queda por resolver como capturar el archivo que intento abrir es decir ya no se abre otra ves pero no puedo obtener el nuevo archivo que intento abrir en mi aplicacion

Pensé que ya sabrías como. Puedes usar cualquier tipo de intercomunicación entre procesos (IPC) como por ejemplo MMF (memory mapped file) para compartir un bloque de memoria entre tus procesos y escribir los argumentos recibidos en el stream, o iguálmente lo puedes hacer con una named pipe, o con un socket si me apuras. Tambien puedes usar la clase EventWaitHandle para crear un 'semáforo' global entre tus procesos, aunque ello implicaría la necesidad de adaptar tu código para volverlo asíncrono (ya que la idea sería detener la ejecución de un thread y enviar una señal de reanudación al iniciar la próxima instancia de tu aplicación con los nuevos argumentos). En fin, formas de hacerlo hay muchas. Yo lo que considero más simple para este escenario en concreto sería declarar una clase que implemente la interfaz INotifyPropertyChanged, y listo.

Te muestro un ejemplo completo mediante la implementación de INotifyPropertyChanged:

CommandLineNotifier.vb
Código
  1. Imports System.Collections.ObjectModel
  2. Imports System.ComponentModel
  3. Imports System.Runtime.CompilerServices
  4.  
  5. Public Class CommandLineNotifier : Implements INotifyPropertyChanged
  6.  
  7.    Public Property Arguments As ReadOnlyCollection(Of String)
  8.        Get
  9.            Return Me.argumentsB
  10.        End Get
  11.        Set(ByVal value As ReadOnlyCollection(Of String))
  12.            If (value.Any()) AndAlso Not (value.Equals(Me.argumentsB)) Then
  13.                Me.argumentsB = value
  14.                Me.NotifyPropertyChanged()
  15.            End If
  16.        End Set
  17.    End Property
  18.    Private argumentsB As ReadOnlyCollection(Of String)
  19.  
  20.    Private Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged
  21.    Public Shared Event ArgumentsReceived As EventHandler(Of ReadOnlyCollection(Of String))
  22.  
  23.    Public Sub New(ByVal notifyCurrentArguments As Boolean)
  24.        If (notifyCurrentArguments) Then
  25.            Me.Arguments = New ReadOnlyCollection(Of String)(Environment.GetCommandLineArgs().Skip(1).ToArray())
  26.        End If
  27.    End Sub
  28.  
  29.    Private Sub NotifyPropertyChanged(<CallerMemberName> Optional ByVal propertyName As String = Nothing)
  30.        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
  31.    End Sub
  32.  
  33.    Private Sub CommandLineNotifier_PropertyChanged(sender As Object, e As PropertyChangedEventArgs) _
  34.    Handles Me.PropertyChanged
  35.  
  36.        Select Case (e.PropertyName)
  37.  
  38.            Case NameOf(Arguments)
  39.                If (CommandLineNotifier.ArgumentsReceivedEvent IsNot Nothing) Then
  40.                    RaiseEvent ArgumentsReceived(Me, Me.argumentsB)
  41.                End If
  42.  
  43.            Case Else
  44.                Throw New NotImplementedException()
  45.  
  46.        End Select
  47.  
  48.    End Sub
  49.  
  50. End Class

ApplicationEvents.vb (la clase donde se controlan los eventos de la aplicación)
Código
  1. Imports Microsoft.VisualBasic.ApplicationServices
  2.  
  3. Namespace My
  4.  
  5.    Partial Friend Class MyApplication
  6.  
  7.        Public Shared CommandLineNotifier As CommandLineNotifier
  8.  
  9.        Public Sub MyApplication_StartupNextInstance(sender As Object, e As StartupNextInstanceEventArgs) Handles Me.StartupNextInstance
  10.            If (e.CommandLine.Any) Then
  11.                My.MyApplication.CommandLineNotifier.Arguments = e.CommandLine
  12.            End If
  13.        End Sub
  14.  
  15.    End Class
  16.  
  17. End Namespace

Form1.vb
Código
  1. Imports System.Collections.ObjectModel
  2.  
  3. Public Class Form1
  4.  
  5.    Public Sub New()
  6.        MyClass.InitializeComponent()
  7.        AddHandler CommandLineNotifier.ArgumentsReceived, AddressOf Me.CommandLineNotifier_ArgumentsReceived
  8.        My.MyApplication.CommandLineNotifier = New CommandLineNotifier(notifyCurrentArguments:=True)
  9.    End Sub
  10.  
  11.    Public Sub CommandLineNotifier_ArgumentsReceived(sender As Object, e As ReadOnlyCollection(Of String))
  12.        ' En este ejemplo añado los nuevos argumentos recibidos, a un ListBox.
  13.        Me.ListBox1.Items.AddRange(DirectCast(sender, CommandLineNotifier).Arguments.ToArray())
  14.    End Sub
  15.  
  16. End Class

Saludos.
« Última modificación: 23 Febrero 2018, 03:49 por Eleкtro » En línea


OscarCadenas_91

Desconectado Desconectado

Mensajes: 27


Ver Perfil
Re: Duda - Como restringir la aplicacion a una instancia?
« Respuesta #4 en: 23 Febrero 2018, 06:10 »

 Muchisimas gracias elektro era justo lo que necesitaba  ;-) , gracias por tomarte el tiempo en ayudarme. 


Salu2 :D
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines