' /** ' --------------------------------------------- ' [- (A) Contenido -] ' --------------------------------------------- ' [- Versión -] = 23.10.22.1459. ' [- Nombre Clase -] = LanzarLinkProcessStartCqs. ' ------------- ' [- Descripción -] = ' Esta clase esta diseñada para lanzar una dirección Url en el ' navegador por defecto instalado en el sistema operativo. ' Hereda de la clase [LanzarLinkProcessStartCommand] para aprovechar ' el código de lanzar un link y no volver a repetirlo ' ' ------------- ' [- Observaciones -] = ' --------------------------------------------------- ' Hereda de la clase [LanzarLinkProcessStartCommand] ' Hereda de la clase [DelegateCommand] ' ' --------------------------------------------------- ' A modo de Historia ' Con la actualización de Net 7.0 algunas instrucciones no funcionan ' como lo hacían antes de la actualización, una de ellas es [Process.Start] ' He tenido problemas con la clase “vieja” que usaba [Process.Start] para lanzar una Url. ' ' Un ejemplo: En Net 7.0 No funciona una instrucción del tipo: ' Process.Start("https://www.youtube.com/watch?v=P5tW-_TeC9c") ' A pesar de que la documentación de Microsoft sigue mostrando es sus ejemplos que si que funciona. ' ' Después de mirar muchas web, al final he encontrado el problema, que consiste ' en que Microsoft ha cambiado el comportamiento de [Process.Start]. ' Parece ser que el objetivo es que se comporte igual en Net.7.0 y en Net.Core. ' Y también he dado con la solución, que consiste en usar la ' propiedad [UseShellExecute = True] y en usar la propiedad [FileName] ' en lugar de la propiedad [Arguments]. ' ' --------------------------------------------------- ' A modo de historia de las clases anteriores ' Esta clase hay que COPIARLA en el ensamblado en la que se usa ' ' Desde [23/02/2007] hasta [23/11/2012] he tenido una clase llamada [LanzarLink] ' que contenía juntas varias funcionalidades que he separado en clases diferentes ' Tienen el prefijo Wpf porque se pueden usare en proyectos dll, Forms y Wpf ' Concretamente las nuevas clases son: ' - [WpfLanzarCalculadora] ' - [WpfLanzarNotepad] ' - [LanzarLinkProcessStartCommand] ' - [LanzarLinkProcessStartCqs] ' - [WpfLanzarNavegador] ' ' Mi clase [WpfMenuMisHerramientas] utiliza las anteriores porque ' habitualmente las incluyo en mis menus Herramientas ' --------------------------------------------------- ' ' ------------- ' [- Bibliografía -] = ' ProcessStartInfo.UseShellExecute Property ' https://learn.microsoft.com/en-au/dotnet/api/system.diagnostics.processstartinfo.useshellexecute?view=net-7.0. ' ------------- ' [- CodigoEjemplo -] = ' --------------------------------------------- ' El código básico es el siguiente: ' Using proceso As New System.Diagnostics.Process ' With proceso ' ' ------------ ' ' OJO - NO USAR - DA PROBLEMAS ' '.StartInfo.Arguments = "www.northwindtraders.com" ' ' ------------ ' .StartInfo.FileName = "http://www.microsoft.es" ' .StartInfo.UseShellExecute = True ' OJO debe ser [True] ' .StartInfo.CreateNoWindow = True ' .Start() ' End With ' End Using. ' --------------------------------------------- ' Forma de uso ' ' Using objLanzador As New Util.Command.LanzarLinkProcessStartCommand("https://www.youtube.com/watch?v=jGflUbPQfW8") ' objLanzador.Execute() ' End Using ' ' --------------------------------------------- ' [- (B) Información básica -] ' --------------------------------------------- ' [- Module Name -] = WpfNet7LanzaUrl.vb. ' [- Propietario -] = AGUILA\Cuenta de Trabajo. ' [- Type -] = vb/file. ' [- Size -] = 25,10 KB - [25703 Bytes]. ' [- Lenguaje -] = spa [es-ES] Español (España). ' ------------- ' [- Fecha de creación -] = 2023-10-21 T 13:01:01. ' [- Última modificación -] = 2023-10-22 T 14:55:29. ' ------------- ' [- Net Framework Release -] = Release: 4.6.1 o posterior. ' [- Net Framework Version -] = Versión: 4.0.30319.42000. ' [- Generador nombre -] = H_DocumentadorClases2022. ' [- Generador Version -] = Versión: 1.2.3.4. ' --------------------------------------------- ' [- (C) Propiedad intelectual -] ' --------------------------------------------- ' [- Autor Nombre -] = Joaquin Medina Serrano. ' [- Autor CorreoE -] = mailto:gmjms32@gmail.com. ' [- Autor Copyright -] = ' Esta obra está bajo una Licencia Creative Commons Atribución-NoComercial-SinDerivar 4.0 Internacional. ' Se puede consultar una copia de la licencia http://creativecommons.org/licenses/by-nc-nd/4.0/. ' --------------------------------------------- ' [- (D) Revisiones -] ' --------------------------------------------- ' [- Historial de revisiones -] = ' - 23/02/2007 - Se añade LanzarNavegadorPorDefecto ' - 14/11/2007 - Se elimina la case [ControlChars] ' - 15/04/2008 - Modifico la función [LanzarNotepad(nomfic)] porque no funcionaba ' - 27/04/2008 - Modificaciones de FxCop (fundamentalmente en el StringWriter) ' - 30/04/2008 - Añado la función de mostrar un texto en el NotePad ' - 17/02/2009 - Creación en Útil ' - 02/04/2011 - Modificación de [MostarTextoToNavegador] ' - 2012/11/23 - Creación - la vuelvo a escribir adaptada para poder ser usada con Wpf ' - 2021/03/18 - Cambiado el acceso de la clase de Friend a Public ' - 2023/10/21 - Creación. Actualizar una clase 'vieja' a Net 7.0. ' --------------------------------------------- ' [- /Eof -] ' */ Option Explicit On Option Strict On Option Infer Off Option Compare Binary Namespace Util.Lanzar ''' ''' Esta clase esta diseñada para lanzar una dirección Url en el ''' navegador por defecto instalado en el sistema operativo. ''' Hereda de la clase [LanzarLinkProcessStartCommand] para aprovechar ''' el código de lanzar un link y no volver a repetirlo ''' Public Class LanzarLinkProcessStartCqs Inherits Util.Command.LanzarLinkProcessStartCommand Implements IDisposable #Region "Constructor" ''' ''' Constructor general ''' Necesario para los constructores [Create] ''' Protected Sub New() MyBase.New() ' El constructor estándar para clases derivadas. No hacer nada End Sub ''' ''' Constructor general ''' Recibe la [DireccionUrlQueSeMuestra As String] ''' Public Sub New(ByVal paramDireccionUrlQueSeMuestra As String) Me.New() MyBase.SetDireccionUrlQueSeMuestra = paramDireccionUrlQueSeMuestra End Sub ''' ''' Constructor general ''' Recibe el [directorio donde se partirá el fichero], y el [nombre completo del fichero], y el [tamaño en BYTES de cada parte] ''' ''' Devuelve un objeto [LanzarLinkProcessStartCqs] con los valores iniciales pasados por parámetro Public Shared Function Create(ByVal paramDireccionUrlQueSeMuestra As String) As LanzarLinkProcessStartCqs '------------------------------------------ ' Alternativa (sobre todo con clases bases) Return New LanzarLinkProcessStartCqs(paramDireccionUrlQueSeMuestra) End Function #End Region #Region "Implements System.Windows.Input.ICommand" ''' ''' ¿ Se puede ejecutar el proceso execute? S/N ''' ''' El objeto parameter tiene que ser una cadena (obligatoriamente) ''' ''' [True], el proceso se puede ejecutar. [False], pues no. ''' ''' ''' El evento [ExecuteChanged] se dispara por la clase base ''' Public Overloads Function CanExecute() As Boolean Return CanExecute(Me.DireccionUrlQueSeMuestra) End Function ''' ''' Esta función muestra la direccionnURL que se recibe por el constructor ''' Public Overloads Sub Execute() Call Execute(Me.DireccionUrlQueSeMuestra) End Sub #End Region #Region "IDisposable Support. [Para clases derivadas] Implementación de .NET Version: [2022/03/03]" ' ''' ''' [Dispose] Código de limpieza de la clase ''' ''' [True], llama el usuario, [False], llama el sistema ''' ''' ''' Dispose (bool quienMeLLama) se ejecuta en dos escenarios distintos. ''' ''' ''' Si [quienMeLLama] es igual a true, el método ha sido llamado ''' directamente, o indirectamente, por el código de un usuario. ''' Los recursos administrados y no administrados se pueden eliminar. ''' ''' ''' Si [quienMeLLama] es igual a false, el método ha sido llamado por el ''' [runtime] desde el interior del finalizador y usted no debe hacer ''' referencia a otros objetos, ni siquiera para eliminarlos. ''' Solo los recursos no administrados pueden ser eliminados. ''' ''' Protected Overloads Sub Dispose(paramQuienMeLLama As System.Boolean) If MyBase.IsDisposed = False Then If paramQuienMeLLama = True Then ' '------------------------------------------------------------------------------------------ ' 1) Liberar UNICAMENTE objetos NO administrados. '------------------------------------------------------------------------------------------ ' Call LiberarRecursosNoAdministrados() ' '------------------------------------------------------------------------------------------ ' 2) Desechar objetos SI administrados. ' Un objeto administrado es cualquier objeto de .NET ' es un objeto de .NET que maneja el motor de ejecución de NET '------------------------------------------------------------------------------------------ ' 3) Establecer campos grandes como Null. '------------------------------------------------------------------------------------------ ' 4) La clase base '------------------------------------------------------------------------------------------ MyBase.Dispose(True) ' Else ' '------------------------------------------------------------------------------------------ ' 1) Liberar UNICAMENTE los objetos NO administrados. '------------------------------------------------------------------------------------------ ' Call LiberarRecursosNoAdministrados() End If End If End Sub ' ''' ' ''' 1) Liberar UNICAMENTE objetos NO administrados. ' ''' Son recursos que NO administra el motor en tiempo de ejecución, ' ''' como conexiones a bases de datos ' ''' llamadas al API de Windows, etc. el Word o Excel ' ''' ' ''' ' ''' ATENCION - Quite los comentarios de Finalize() SOLO si el anterior Dispose(disposing As Boolean) ' ''' tiene código para liberar recursos no administrados. ' ''' ' Private Sub LiberarRecursosNoAdministrados() ' ' si no hay recursos, no hacer nada ' End Sub ' ''' ' ''' Permite que un objeto intente liberar recursos NO ADMINISTRADOS y realizar otras operaciones de limpieza ' ''' antes de que sea reclamado por la recolección de elementos no utilizados. ' ''' ' ''' ' ''' ATENCION - Quite los comentarios de Finalize() SOLO si el anterior Dispose(disposing As Boolean) ' ''' tiene código para liberar recursos no administrados. ' ''' ' Protected Overrides Sub Finalize() ' 'ATENCION - Quite los comentarios de Finalize() SOLO si el anterior Dispose(disposing As Boolean) ' ' tiene código para liberar recursos no administrados. ' ' No cambie este código. Coloque el código de limpieza en el anterior Dispose(disposing As Boolean). ' Dispose(False) ' MyBase.Finalize() ' End Sub #End Region End Class End Namespace