Componente para extraer parámetros de la
línea de comandos
Fecha: 03/Feb/99 (03/Ene/99)
Autor: Ignacio Cassou < [email protected]
>
Te mando una utilidad que he creado a partir de código que
hacía tiempo que usaba en mis aplicaciones pero que por pereza nunca me había decidido a
re-escribir como un componente independiente.
Está realizado en VB5 y no se puede compilar en VB4 porque es un EXE ActiveX, aunque sí
se puede utilizar desde un programa VB4 si ya se tiene el 'exe' del componente (por eso te
lo adjunto también, además de que, como le he puesto compatibilidad binaria para evitar
que cada vez que se compile genere un CLSID diferente, también es necesario tener el EXE
en el mismo directorio en que esté el código fuente para que VB no se queje).
Se trata de un componente que permite extraer los parámetros que se le pasen a un
programa VB de una forma sencilla y eficaz siempre y cuando se siga un determinado
convenio en la forma de escribir los parámetros en la linea de comando. La forma de
llamar al ejecutable VB sería :
Programa.exe /NombrePar1:ValorPar1/NombrePar2:ValorPar2/.....
Donde:
- NombrePar1, NombrePar2 pueden ser cualquier string de cualquier longitud (que no
contengan ni '/' ni ':' claro) y da igual que sean mayúsculas o minúsculas.
- ValorPar1, ValorPar2 pueden ser cualquier string incluso aunque contengan '/' y ':'
siempre y cuando no combinemos ambos signos de manera que el programa se haga un lío.Me
explico : la rutina encuentra las parejas 'nombre parámetro-valor' buscando parejas de
'/' y ':', es decir, lo que encuentre entre una '/' y ':' lo considera como el nombre del
parámetro, mientras que todo lo que esté a la derecha de ':' será el valor del
parámetro. Una vez encontrado un parámetro y su valor, lo elimina de la cadena y sigue
buscando más parámetros.
Te envío también un sencillo programa de ejemplo de como usarlo y aquí explico (aunque
sé que tú no necesitas esta explicación) como hacerlo, ya que se trata de un EXE
ActiveX y para aquellos que nunca hayan usado ninguno puede ser problemático.
Para los que tengan VB5 (o superior) y lo quieran ejecutar en modo 'debug' :
- Abrir el proyecto ParamLC.vbp y generar de nuevo el ejecutable.
- Una vez generado lo ejecutáis usando 'Iniciar con compilación completa' (menú
'Ejecutar' en VB5).
- Abrir el proyecto EjemploParamLC.vbp (si habéis copiado el EXE de ParamLC que yo he
adjuntado no deberéis tener problemas, de lo contrario ospodría suceder que en
'Proyecto->Referencias' os diera el error 'Referencia no encontrada')
- Como ya debéis de saber, los parámetros en modo 'debug' los toma de lo que se haya
introducido en 'Proyecto->Propiedades->Generar->Argumentos de la línea de
comandos'.
En el ejemplo que os envío hay unos parámetros de ejemplo que podéis cambiar a vuestro
gusto y ver que realmente está extrayendo lo que le habés pasado.
- Ya lo podéis ejecutar y ver que pasa.
Para los que no tengan VB5 y quieran usar la utilidad (o para usarlo en un programa nuevo)
:
- Abrir un nuevo proyecto y en 'Proyecto->Referencias' deberéis marcar la casilla de
verificación correspondiente a 'ParamLC - Captación de parámetros'.
- Si no os aparece en la lista de componentes simplemente buscar el ParamLC.exe en el
disco y seleccionarlo.
Por último, si tenéis que instalar un programa basado en esta utilidad en otro PC, no
olvidéis incluir también este componente en los archivos de instalación como un
componente compartido.
Bueno, ya está bien de literatura que tengo sueño y me estoy quedando dormido.
Saludos,
Nacho.
El código: (o parte de él, el resto está en el zip)
' 'Clase: "ParamLCCol" Public Nombre As String Public Valor As String 'Clase: "ParamLCCLass" Public Function LeerParametros(LineaComandos As String) As Boolean LeerParametros = CaptarParametros(LineaComandos) End Function Public Function ValorParametro(NombreParametro As String) As String Dim Parametro ValorParametro = "" 'Buscamos dentro de la colección 'Parametros' uno que tenga 'el mismo nombre que el que solicitamos For Each Parametro In Parametros If UCase(Parametro.Nombre) = UCase(NombreParametro) Then ValorParametro = Parametro.Valor Exit For End If Next End Function 'Módulo bas: "ParamLCMod" Public Parametros As New Collection Public Function CaptarParametros(LineaComandos As String) As Boolean Dim StrParametro As String Dim Contador As Integer Dim PosDosPuntos As Integer Dim SwEncontrado As Boolean Dim SWHayAlgo As Boolean Dim PrimByteNoSlash As Integer Do While Parametros.Count > 0 Parametros.Remove 1 Loop 'Esta es la rutina que trata el string de la línea de comandos 'y separa los parámetros según el siguiente convenio : ' /NombreParámetro1:Valor/NombreParámetro2:Valor/..... 'Cada vez que encuentra una pareja nombre-valor lo guarda en una 'colección interna sirviéndose de la clase ParamLCCol. CaptarParametros = False SWHayAlgo = False SwEncontrado = False PrimByteNoSlash = 1 Do While Not SwEncontrado And PrimByteNoSlash < Len(LineaComandos) Do While PrimByteNoSlash < Len(LineaComandos) If Mid$(LineaComandos, PrimByteNoSlash, 1) <> "/" Then PrimByteNoSlash = PrimByteNoSlash + 1 Else Exit Do End If Loop Do While PrimByteNoSlash < Len(LineaComandos) If Mid$(LineaComandos, PrimByteNoSlash, 1) = "/" Then PrimByteNoSlash = PrimByteNoSlash + 1 Else SwEncontrado = True Exit Do End If Loop Loop Contador = Len(LineaComandos) Do While Contador >= PrimByteNoSlash - 1 And Contador > 0 SwEncontrado = False Do While Not SwEncontrado And Contador >= PrimByteNoSlash - 1 If Mid$(LineaComandos, Contador, 1) = ":" Then Do While Not SwEncontrado And Contador >= PrimByteNoSlash - 1 If Mid$(LineaComandos, Contador, 1) = "/" Then SwEncontrado = True SWHayAlgo = True Exit Do End If Contador = Contador - 1 Loop End If If Not SwEncontrado Then Contador = Contador - 1 End If Loop If Contador >= PrimByteNoSlash - 1 Then 'Definimos Parametro como ParamLCCol Dim Parametro As New ParamLCCol StrParametro = Right$(LineaComandos, Len(LineaComandos) - Contador + 1) LineaComandos = Left$(LineaComandos, Contador - 1) PosDosPuntos = InStr(1, StrParametro, ":") If PosDosPuntos < Len(StrParametro) Then Parametro.Valor = Mid$(StrParametro, PosDosPuntos + 1) Else Parametro.Valor = "" End If Parametro.Nombre = Mid$(StrParametro, 2, PosDosPuntos - 2) 'Añadimos el nombre del parámetro y su valor a la 'colección 'Parametros' Parametros.Add Parametro Set Parametro = Nothing End If Loop If SWHayAlgo Then CaptarParametros = True End If End Function
Fichero con el código de ejemplo (param_nacho.zip 8.81 KB)