none
¿Cómo hacer para que al presionar Nuevo dentro mi aplicación se abra otra nueva instancia de mi aplicación?

    Pregunta

  • Muy buenas tardes;

    Estoy desarrollando una aplicación con formato propio, y ahora estoy queriendo crear la función de Nuevo, con el fin de que si el usuario quiere crear un nuevo uso de la aplicación, corra de nuevo la aplicación como si lo hiciera desde el mismo .exe del ejecutable, pero me crea problemas. ¿Cuál es el procedimiento para esto?. Agradezco su ayuda.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    martes, 4 de abril de 2017 17:29

Respuestas

  • "Harold Quintero Pineda", escribió:

    > Estoy desarrollando una aplicación con formato propio, y ahora estoy queriendo
    > crear la función de Nuevo, con el fin de que si el usuario quiere crear un nuevo
    > uso de la aplicación, corra de nuevo la aplicación como si lo hiciera desde el
    > mismo .exe del ejecutable ...

    Hola, Harold:

    Salvo que esté equivocado, entiendo que lo que deseas es abrir una nueva instancia de tu aplicación cuando el usuario hace clic sobre el botón Nuevo, y lo primero que habría que saber es si tu aplicación permite que se ejecuten varias instancias de la misma para que en un momento determinado puedan existir ejecutándose simultáneamente 1, 2, ... 28 instancias de ella.

    > ... pero me crea problemas.

    ¿Y qué código estás ejecutando en el evento clic de ese botón para que te "cree problemas"?

    >  Yo tengo este Main: ... Eso quería mostrarlo, con el fin de saber si es posible de
    > usar un código como el Application.Run, que pueda usar para hacer eso. En resumen
    > ¿no existe otra forma que esa?. Sino, es así ¿podría mostrarme un ejemplar de la
    > solución que usted me plantea?.

    La única manera para lanzar una nueva instancia de tu aplicación desde la propia aplicación es invocarla como invocarías la ejecución de cualquier otra aplicación diferente, mediante el método Start de la clase Process, porque al método Run del objeto Application solamente le puedes especificar un objeto ApplicationContext, un objeto Form, o no indicarle nada para que se inicie la ejecución de un bucle de mensajes en el subproceso actual sin un formulario concreto.

    Suponiendo que tu aplicación permite que se ejecuten varias instancias de la misma, la solución es tan sencilla como ejecutar lo siguiente en el evento clic de ese botón llamado Nuevo:

        Private Sub btnNuevo_Click(sender As Object, e As EventArgs) Handles btnNuevo.Click
    
            Try
                ' Iniciamos una nueva instancia de la aplicación. Para ello le
    ' especificamos al constructor del objeto ProcessStartInfo la
    ' ruta completa del ejecutable de la aplicación. ' Dim startInfo As New ProcessStartInfo(Application.ExecutablePath) ' A modo de ejemplo, le pasamos como argumento de la línea de comandos ' la ruta correspondiente al archivo ejecutable de la aplicación. ' startInfo.Arguments = String.Format("""{0}""", Application.ExecutablePath) Process.Start(startInfo) Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub


    Aprovecho el mensaje para indicarte que mejor será que el procedimiento Sub Main lo ejecutes como indico a continuación:

    <STAThread> Sub Main()

            'Application.SetCompatibleTextRenderingDefault(False)
            Application.EnableVisualStyles()
    Dim argumento As String = String.Empty ' Comprobar si se ha especificado algún argumento válido en la línea de comandos. ' If ((My.Application.CommandLineArgs.Count > 0) AndAlso (My.Application.CommandLineArgs(0).Length > 0)) Then ' Al menos se ha especificado un argumento válido en la línea de comandos ' donde su valor no es una cadena de longitud de cero. '
    argumento = My.Application.CommandLineArgs(0)
    ' Envío la ruta del archivo, para que se cargue. Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento) 'Puede darse el caso que quiera abrir 2 archivos diferentes y entre en 'conflicto por ni crear una nueva instancia para abrir el form principal. End If ' Se haya o no especificado argumentos en la línea de comandos, ' crear siempre una nueva instancia del formulario Form1 pasándole ' el argumento especificado en la línea de comandos. ' Application.Run(New Form1(argumento)) End Sub

    Como podrás observar, al constructor de Form1 le estamos pasando el argumento especificado en la línea de comandos. Esto requiere tener que establecer un constructor Public o Friend con un argumento del tipo String en la clase Form1:

    Public Class Form1 Friend Sub New(argumento As String) ' Esta llamada es exigida por el diseñador. InitializeComponent() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). ' ' Leemos el valor del argumento MessageBox.Show(argumento) End Sub End Class

    Como en el constructor de Form1 estamos obteniendo el valor del argumento pasado en la línea de comandos, lo mismo ya no es necesario que ejecutes en el procedimiento Sub Main la siguiente llamada:

        ' Envío la ruta del archivo, para que se cargue.
        Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento)

    Y la efectúes dentro del propio constructor del formulario Form1:

        Friend Sub New(argumento As String)
    
            ' Esta llamada es exigida por el diseñador.
            InitializeComponent()
    
            ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
            '
            If (argumento.Length > 0) Then
                ' Envío la ruta del archivo, para que se cargue.
                Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento)
            End If
    
       End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de abril de 2017 15:43
    Moderador
  • "Harold Quintero Pineda" preguntó:

    > ¿cómo permito que en mi aplicación  se ejecuten varias instancias de la misma?. Tengo
    > entendido que es dentro de las propiedades del proyecto, tal cual lo ilustra la siguiente
    > captura:

    Si no tienes activado el marco de trabajo de la aplicación (que ello sucederá si el objeto de inicio de la aplicación es el procedimiento Sub Main), en principio tu aplicación permitirá varias instancias de la misma, por tanto, no te tienes que preocupar de ello.

    Escribo "en principio", porque aunque no se tenga activado el marco de trabajo de la aplicación, podemos hacer que nuestra aplicación sea de instancia única ejecutando dentro del procedimiento Sub Main un código parecido al que encontrarás en el siguiente enlace:

    Comprobar si hay una instancia previa de nuestra aplicación

    Pero si en el procedimiento Sub Main te limitas únicamente a obtener los argumentos especificados en la línea de comandos y finalmente ejecutar el método Run del objeto Application, tu aplicación permitirá todas las instancias que se ejecuten de ella.

    > Ahora, mi inconveniente radica con el procedimiento Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento),
    > pues éste lo tenìa creado para deserealizar un archivo de mi aplicación, cuando se pasara por la linea
    > de comando la ruta del archivo, y con su aclaración, se me genera conflictos específicamente cunado
    > quiero abrir una nueva instancia con la opción de Nuevo, ...
    >
    > Ésto genera una excepción, pues no puede desearilizar dicho archivo, pues claramente lo que se quiere es
    > abrir una nueva instancia, ya que dicho argumento es pasado al hacer  clic sobre la opción Nuevo,  y al
    > intentar desearilizarlo fallará el método Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento).
    >
    > Espero haberme hecho entender de la mejor manera señor Montejo, y pueda ayudarme a solucionarlo de la
    > manera más técnica posible.

    Pues siento muchísimo tener que decirte que no me he enterado de nada. Debes de comprender que yo me limité únicamente a responder a tu pregunta, para que desde el propio ejecutable de tu aplicación pudieras abrir otra instancia de la misma, tal y como demandabas en el Asunto de tu pregunta:

    [...] ¿Cómo hacer para que al presionar Nuevo dentro mi aplicación se abra otra nueva instancia de mi aplicación? [...]

    ¿Que ahora resulta que tienes problemas por ejecutar el método Process.Start() para iniciar una nueva instancia de tu aplicación cuando el usuario hace clic sobre el botón Nuevo? Pues lo lamento profundamente, pero no veo yo otra manera de crear una nueva instancia de la propia aplicación sin hacer uso del método Process.Start(). Digo yo que tendrás que adaptar tu aplicación para que se acomode al método Process.Start(startInfo).

    Por cierto, me acaba de venir a la mente lo siguiente. Fíjate en el comentario de la siguiente línea:

        ' A modo de ejemplo, le pasamos como argumento de la línea de comandos
        ' la ruta correspondiente al archivo ejecutable de la aplicación.
        '
        startInfo.Arguments = String.Format("""{0}""", Application.ExecutablePath)

    Como podrás observar, escribo "A modo de ejemplo, le pasamos como argumento de la línea de comandos la ruta correspondiente al archivo ejecutable de la aplicación", pero no quiere decir que tú le tengas que pasar la ruta del archivo ejecutable como argumento de la línea de comandos. ¿No será ahí donde radica el problema que dices que tienes, que al estar pasándole la ruta del propio archivo ejecutable de tu aplicación estás intentando deserializarlo?

    A la propiedad Arguments del objeto ProcessStartInfo le tienes que especificar la ruta del archivo que realmente deseas deserializar, pero no la del ejecutable de tu aplicación.

    Espero que el problema se deba a esto último. ;-)

     


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 12 de abril de 2017 15:06
    Moderador

Todas las respuestas

  • Hola Tendrías que tener tu aplicación instalada y llamarla desde su ruta y que ejecute el .exe de la carpeta mapeada Saludos

    Si ayudé a resolver tu consulta, no olvides marcar como respuesta y/o votar como útil.

    martes, 4 de abril de 2017 17:46
  • Hola, muchas gracias de antemano.  Yo tengo este Main:

    Module Iniciar
        <STAThread>
        Sub Main()
            '
            '
            'Verifico que al iniciar la aplicaciòn no se le está pasando el parámetro del archivo(con extensiòn)
            'Es decir, la aplicaciòn se abre de forma habitual, mas no se carga un archivo.
            If My.Application.CommandLineArgs.Count = Nothing OrElse My.Application.CommandLineArgs(0) = String.Empty Then
    
                'Por tal motivo, abro la aplicación con sus valores por defecto. También sirve
                'para cuando dentro de la aplicación presione el botón Abrir, estando trabajando
                'en otro archivo.
    
                'Application.SetCompatibleTextRenderingDefault(False)
                Application.EnableVisualStyles()
                Application.Run(New Form1())
    
                'En caso contrario, se quiere cargar un archivo, por ende leo dicho file,
                'con el fin de mostrar los datos guardados en ese objeto en mi aplicación.
            Else
    
    
                'Envío la ruta del archivo, para que se cargue.
                Mdl_funciones_abrir_guardar.Cargar_Archivo(My.Application.CommandLineArgs(0))
                Form1.ShowDialog()
    
    
                'Puede darse el caso que quiera abrir 2 archivos diferentes y entre en
                'conflicto por ni crear una nueva instancia para abrir el form principal.
    
            End If
    
        End Sub

    Eso quería mostrarlo, con el fin de saber si es posible de usar un código como el Application.Run, que pueda usar para hacer eso. En resumen ¿no existe otra forma que esa?. Sino, es así ¿podría mostrarme un ejemplar de la solución que usted me plantea?.

    Muchas gracias.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    martes, 4 de abril de 2017 18:27
  • "Harold Quintero Pineda", escribió:

    > Estoy desarrollando una aplicación con formato propio, y ahora estoy queriendo
    > crear la función de Nuevo, con el fin de que si el usuario quiere crear un nuevo
    > uso de la aplicación, corra de nuevo la aplicación como si lo hiciera desde el
    > mismo .exe del ejecutable ...

    Hola, Harold:

    Salvo que esté equivocado, entiendo que lo que deseas es abrir una nueva instancia de tu aplicación cuando el usuario hace clic sobre el botón Nuevo, y lo primero que habría que saber es si tu aplicación permite que se ejecuten varias instancias de la misma para que en un momento determinado puedan existir ejecutándose simultáneamente 1, 2, ... 28 instancias de ella.

    > ... pero me crea problemas.

    ¿Y qué código estás ejecutando en el evento clic de ese botón para que te "cree problemas"?

    >  Yo tengo este Main: ... Eso quería mostrarlo, con el fin de saber si es posible de
    > usar un código como el Application.Run, que pueda usar para hacer eso. En resumen
    > ¿no existe otra forma que esa?. Sino, es así ¿podría mostrarme un ejemplar de la
    > solución que usted me plantea?.

    La única manera para lanzar una nueva instancia de tu aplicación desde la propia aplicación es invocarla como invocarías la ejecución de cualquier otra aplicación diferente, mediante el método Start de la clase Process, porque al método Run del objeto Application solamente le puedes especificar un objeto ApplicationContext, un objeto Form, o no indicarle nada para que se inicie la ejecución de un bucle de mensajes en el subproceso actual sin un formulario concreto.

    Suponiendo que tu aplicación permite que se ejecuten varias instancias de la misma, la solución es tan sencilla como ejecutar lo siguiente en el evento clic de ese botón llamado Nuevo:

        Private Sub btnNuevo_Click(sender As Object, e As EventArgs) Handles btnNuevo.Click
    
            Try
                ' Iniciamos una nueva instancia de la aplicación. Para ello le
    ' especificamos al constructor del objeto ProcessStartInfo la
    ' ruta completa del ejecutable de la aplicación. ' Dim startInfo As New ProcessStartInfo(Application.ExecutablePath) ' A modo de ejemplo, le pasamos como argumento de la línea de comandos ' la ruta correspondiente al archivo ejecutable de la aplicación. ' startInfo.Arguments = String.Format("""{0}""", Application.ExecutablePath) Process.Start(startInfo) Catch ex As Exception ' Se ha producido un error MessageBox.Show(ex.Message) End Try End Sub


    Aprovecho el mensaje para indicarte que mejor será que el procedimiento Sub Main lo ejecutes como indico a continuación:

    <STAThread> Sub Main()

            'Application.SetCompatibleTextRenderingDefault(False)
            Application.EnableVisualStyles()
    Dim argumento As String = String.Empty ' Comprobar si se ha especificado algún argumento válido en la línea de comandos. ' If ((My.Application.CommandLineArgs.Count > 0) AndAlso (My.Application.CommandLineArgs(0).Length > 0)) Then ' Al menos se ha especificado un argumento válido en la línea de comandos ' donde su valor no es una cadena de longitud de cero. '
    argumento = My.Application.CommandLineArgs(0)
    ' Envío la ruta del archivo, para que se cargue. Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento) 'Puede darse el caso que quiera abrir 2 archivos diferentes y entre en 'conflicto por ni crear una nueva instancia para abrir el form principal. End If ' Se haya o no especificado argumentos en la línea de comandos, ' crear siempre una nueva instancia del formulario Form1 pasándole ' el argumento especificado en la línea de comandos. ' Application.Run(New Form1(argumento)) End Sub

    Como podrás observar, al constructor de Form1 le estamos pasando el argumento especificado en la línea de comandos. Esto requiere tener que establecer un constructor Public o Friend con un argumento del tipo String en la clase Form1:

    Public Class Form1 Friend Sub New(argumento As String) ' Esta llamada es exigida por el diseñador. InitializeComponent() ' Agregue cualquier inicialización después de la llamada a InitializeComponent(). ' ' Leemos el valor del argumento MessageBox.Show(argumento) End Sub End Class

    Como en el constructor de Form1 estamos obteniendo el valor del argumento pasado en la línea de comandos, lo mismo ya no es necesario que ejecutes en el procedimiento Sub Main la siguiente llamada:

        ' Envío la ruta del archivo, para que se cargue.
        Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento)

    Y la efectúes dentro del propio constructor del formulario Form1:

        Friend Sub New(argumento As String)
    
            ' Esta llamada es exigida por el diseñador.
            InitializeComponent()
    
            ' Agregue cualquier inicialización después de la llamada a InitializeComponent().
            '
            If (argumento.Length > 0) Then
                ' Envío la ruta del archivo, para que se cargue.
                Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento)
            End If
    
       End Sub

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    viernes, 7 de abril de 2017 15:43
    Moderador
  • Hola, muy buenos dìas señor Enrique, que gusto en saludarle de nuevo;

    Agradeciendo de antemano, por su gran esfuerzo y dedicaciòn de tiempo por ayudarme. Voy a asimilar las dos enormes y grandes respuestas que me ha dado(la otra en otro hilo, tambièn muy amablemente me respondiò), voy a poner en pràctica lo dicho, y estarè comentando como me fue. Sabiendpo su enorme sabidurìa, se que me servirà de maravilla.

    Gracias de nuevo, voy a probar como me va. Estarè respondiendo apenas lo compruebe.

    Dios le bendiga.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    lunes, 10 de abril de 2017 16:43
  • Muy buenos dìas señor Montejo;

    He implementado su solución, y antes de hacerle conocer una dificultad que tengo, quisiera preguntarle ¿cómo permito que en mi aplicación se ejecuten varias instancias de la misma?. Tengo entendido que es dentro de las propiedades del proyecto, tal cual lo ilustra la siguiente captura:

    ¿Debo mediante código en el Main, hacer algo adicional?.

    Ahora, mi inconveniente radica con el procedimiento Mdl_funciones_abrir_guardar.Cargar_Archivo

    (argumento), pues éste lo tenìa creado para deserealizar un archivo de mi aplicación, cuando se pasara por la linea

    de comando la ruta del archivo, y con su aclaración, se me genera conflictos específicamente cunado

    quiero abrir una nueva instancia con la opción de Nuevo, pues de acuerdo a la otra respuesta en el otro hilo que gentìlmente me ha dado, ,me ha dado

    èste còdigo:

            Try
                ' Iniciamos una nueva instancia de la aplicación. Para ello le
                ' especificamos al constructor del objeto ProcessStartInfo la
                ' ruta completa del ejecutable de la aplicación.
                '
                Dim startInfo As New ProcessStartInfo(Application.ExecutablePath)
    
                ' A modo de ejemplo, le pasamos como argumento de la línea de comandos
                ' la ruta correspondiente al archivo ejecutable de la aplicación.
                '
                startInfo.Arguments = String.Format("""{0}""", Application.ExecutablePath)
    
                Process.Start(startInfo)
    
            Catch ex As Exception
                ' Se ha producido un error
                MessageBox.Show(ex.Message)
    
            End Try

    Dicho código, también pasarà por la línea de comando un Argumento, y el còdigo que tengo dentro del procedimiento Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento), es el siguiente:

        ''' <summary>
        ''' Este procedimiento sirve para cargar un archivo determinado de la aplicación.
        ''' Se uusar especificamente cuando se abre un archivo al presionar doble clic sobre
        ''' él y se abre nuestra applicación. Para esto nuestro programa debe haberse registrado en la
        ''' computadora con un instalador.
        ''' </summary>
        ''' <param name="filename">Ruta del archivo a cargar al programa.</param>    
        Public Sub Cargar_Archivo(ByVal filename As String)
    
            Try
                ' Creamos una nueva instancia de la clase Cl_contenedora como
                ' resultado de deserializar el archivo especificado.
                Dim desearilizador As New Cl_Serializacion_Binaria()
    
                'Obtenemos el objeto desearilizado.
                Dim cargardatos As Cl_contenedora = CType(desearilizador.Deserialize(filename), Cl_contenedora)
    
                '_______________________________________________________________________________________________
                'Asigno a todos los formularios del proyecto, la instancia de su Clase correspondiente
                'proveniente del Archivo deserealizado.
                '
                '-***Instancia de la Clase Cl_Detalles***
                Frm_Detalles.Ins_Cl_Detalles = cargardatos.Cl_Detalles
    
                '***Instancia de la Clase Ins_Cl_Opciones***
                Frm_Opciones.Ins_Cl_Opciones = cargardatos.Cl_Opciones
    
                'Se termina de asiganr todas las instancias de las clases, provenientes del Archvo desearilziado.
                '________________________________________________________________________________________________
    
    
                ' Si todo ha ido bien, guardamos en el
                ' campo del módulo la ruta del archivo abierto.
                c_file_name = filename
    
                'Obtenemos el nombre de solo el archivo de la ruta del archivo desearilizado.
                Dim name_file_safe As String = System.IO.Path.GetFileNameWithoutExtension(filename)
    
                'Finalmente, colocamos el nombre del archivo abierto al formulario principal.
                Form1.Text = name_file_safe
    
    
                'En caso de errores, como por ejemplo intentar abrir un archivo de otra extensión
                'se muestra el errro.
            Catch ex As Exception
                ' Se ha producido un error.
                DevExpress.XtraEditors.XtraMessageBox.Show("Se ha producido un error al intentar abrir el archivo." & vbNewLine &
                                                           "No se puede abrir archivos con otro tipo de extensión.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
                DevExpress.XtraEditors.XtraMessageBox.Show(ex.ToString)
            End Try
    
    
        End Sub

    Ésto genera una excepción, pues no puede desearilizar dicho archivo, pues claramente lo que se quiere es abrir una nueva instancia, ya que dicho argumento es pasado al hacer clic sobre la opción Nuevo,  y al intentar desearilizarlo fallará el método Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento).

    Espero haberme hecho entender de la mejor manera señor Montejo, y pueda ayudarme a solucionarlo de la manera más técnica posible.

    Muchas gracias por todo, quedo atento.




    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970



    martes, 11 de abril de 2017 15:50
  • "Harold Quintero Pineda" preguntó:

    > ¿cómo permito que en mi aplicación  se ejecuten varias instancias de la misma?. Tengo
    > entendido que es dentro de las propiedades del proyecto, tal cual lo ilustra la siguiente
    > captura:

    Si no tienes activado el marco de trabajo de la aplicación (que ello sucederá si el objeto de inicio de la aplicación es el procedimiento Sub Main), en principio tu aplicación permitirá varias instancias de la misma, por tanto, no te tienes que preocupar de ello.

    Escribo "en principio", porque aunque no se tenga activado el marco de trabajo de la aplicación, podemos hacer que nuestra aplicación sea de instancia única ejecutando dentro del procedimiento Sub Main un código parecido al que encontrarás en el siguiente enlace:

    Comprobar si hay una instancia previa de nuestra aplicación

    Pero si en el procedimiento Sub Main te limitas únicamente a obtener los argumentos especificados en la línea de comandos y finalmente ejecutar el método Run del objeto Application, tu aplicación permitirá todas las instancias que se ejecuten de ella.

    > Ahora, mi inconveniente radica con el procedimiento Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento),
    > pues éste lo tenìa creado para deserealizar un archivo de mi aplicación, cuando se pasara por la linea
    > de comando la ruta del archivo, y con su aclaración, se me genera conflictos específicamente cunado
    > quiero abrir una nueva instancia con la opción de Nuevo, ...
    >
    > Ésto genera una excepción, pues no puede desearilizar dicho archivo, pues claramente lo que se quiere es
    > abrir una nueva instancia, ya que dicho argumento es pasado al hacer  clic sobre la opción Nuevo,  y al
    > intentar desearilizarlo fallará el método Mdl_funciones_abrir_guardar.Cargar_Archivo(argumento).
    >
    > Espero haberme hecho entender de la mejor manera señor Montejo, y pueda ayudarme a solucionarlo de la
    > manera más técnica posible.

    Pues siento muchísimo tener que decirte que no me he enterado de nada. Debes de comprender que yo me limité únicamente a responder a tu pregunta, para que desde el propio ejecutable de tu aplicación pudieras abrir otra instancia de la misma, tal y como demandabas en el Asunto de tu pregunta:

    [...] ¿Cómo hacer para que al presionar Nuevo dentro mi aplicación se abra otra nueva instancia de mi aplicación? [...]

    ¿Que ahora resulta que tienes problemas por ejecutar el método Process.Start() para iniciar una nueva instancia de tu aplicación cuando el usuario hace clic sobre el botón Nuevo? Pues lo lamento profundamente, pero no veo yo otra manera de crear una nueva instancia de la propia aplicación sin hacer uso del método Process.Start(). Digo yo que tendrás que adaptar tu aplicación para que se acomode al método Process.Start(startInfo).

    Por cierto, me acaba de venir a la mente lo siguiente. Fíjate en el comentario de la siguiente línea:

        ' A modo de ejemplo, le pasamos como argumento de la línea de comandos
        ' la ruta correspondiente al archivo ejecutable de la aplicación.
        '
        startInfo.Arguments = String.Format("""{0}""", Application.ExecutablePath)

    Como podrás observar, escribo "A modo de ejemplo, le pasamos como argumento de la línea de comandos la ruta correspondiente al archivo ejecutable de la aplicación", pero no quiere decir que tú le tengas que pasar la ruta del archivo ejecutable como argumento de la línea de comandos. ¿No será ahí donde radica el problema que dices que tienes, que al estar pasándole la ruta del propio archivo ejecutable de tu aplicación estás intentando deserializarlo?

    A la propiedad Arguments del objeto ProcessStartInfo le tienes que especificar la ruta del archivo que realmente deseas deserializar, pero no la del ejecutable de tu aplicación.

    Espero que el problema se deba a esto último. ;-)

     


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    miércoles, 12 de abril de 2017 15:06
    Moderador
  • Muy buenos días señor Montejo;

    Sabe, si, acabo de caer en razón acerca de que la línea del Process.Star(), me la dá como un ejemplo, por lo cual pido mis más sinceras disculpas. Como ustd me dice adaptaré mi ejemplo a mis necesidades. Agradezco mucho por su tiempo y amabilidad. Dios le bendiga.

    Estaré haciendo otras preguntas a medida que desarrollé esta aplicación.

    Muchas gracias por todo.


    Harold Alonso Quintero Pineda Ingeniero Civil Universidad Francisco de Paula Santander Ocaña Correo: haroldpineda1401@outlook.com Cel: 3158700970

    domingo, 16 de abril de 2017 19:43