[VB6] Una ayuda con mi primer programa... plz :)

Iniciado por SuperDraco, 13 Julio 2011, 18:04 PM

0 Miembros y 1 Visitante están viendo este tema.

SuperDraco

Hola, a ver se que el programa es simple, no sirve mucho, por eso es ideal para ser el primero y hacer pruebas, tengo echo esto:



en la opción "archivo" hay otra que se llama "Elegir directorio", la idea es usar esa opción, se elige la carpeta, y me la guarda en "FName", que no se si llamarla variable o string, porque aún no entiendo bien las funciones básicas xD...

...Bueno eso ya lo he conseguido, después de obtener el "FName", la idea es darle al botón "Empezar", y lo que debería hacer es:

1º - si no encuentra ningún archivo con extensión ".msu", mandar un error, en un msgbox o como sea

2º -  que a la derecha del botón aparezca un contador con la cantidad de actualizaciones que hay en la carpeta seleccionada (Osea, la cantidad de archivos MSU)

3º - Ejecutar una a una (No todas a la vez) cada archivo con extensión ".msu"

4º - Que el contador vaya restando los archivos que ya se han instalado, (Por ejemplo  "Quedan 7 de 30 actualizaciones" 0 "7 de 30")

Y luego no tengo ni idea de como hacer funcionar la casilla de reiniciar pc, ya me he enterado de como reiniciar el pc con vb, pero no se como hacerlo cuando el comando "empezar" termine de instalar las updates...  :-\


Simplemente eso, ¿Alguien me ayuda?



EDITO: se me olvidaba, aqui el código entero, por si hace falta...

Código (vb) [Seleccionar]


Private Sub opendir_Click()
  Dim FName As String
FName = BrowseFolder(Caption:="Selecciona una carpeta")
If FName = vbNullString Then
   Debug.Print "No Folder Selected"
Else
   Debug.Print "Selected Folder: " & FName
End If
End Sub

Private Sub Check6_Click()
If Check6.Value = 1 Then
   Text6.Enabled = True
ElseIf Check6.Value = 0 Then
   Text6.Enabled = False
End If
End Sub


Private Sub english_Click()
Check6.Caption = "Reset PC after install updates."
Frame1.Caption = "Additional options"
opendir.Caption = "Open directory..."
virus.Caption = "File"
salir.Caption = "Exit"
Sobre.Caption = "About..."
Idioma.Caption = "Language"
español.Caption = "Spanish"
english.Caption = "English"
End Sub

Private Sub español_Click()
Check6.Caption = "Reiniciar PC después de instalar actualizaciones."
Frame1.Caption = "Opciones adicionales"
opendir.Caption = "Abrir directorio..."
virus.Caption = "Archivo"
salir.Caption = "Salir"
Sobre.Caption = "Sobre..."
Idioma.Caption = "Idioma"
español.Caption = "Español"
english.Caption = "Inglés"
End Sub

Private Sub salir_Click()
Unload Me
End Sub

Private Sub Sobre_Click()
MsgBox ("WinUpdates Installer 1.0" & vbNewLine & "" & vbNewLine & "By PiToLoKo" & vbNewLine & vbNewLine & "www.foro.elhacker.net")
End Sub
No he vuelto, solo estoy de paso.

79137913

#1
HOLA!!!

Fname si es el NombreDelArchivo es una variable String.

(estos ejemplos te los hago como si la carpeta fuera C:\ y con cosas basicas)

1:
Código (vb) [Seleccionar]
If Dir("c:\*.msu") = vbNullString Then
   MsgBox "error no se encuentra archivo msu"
   'esto yo lo haria con un If de una linea pero para empezar dejalo asi
End If


2:
Código (vb) [Seleccionar]
Dim CT As Integer
Dim archivo As String
   archivo = Dir("c:\*.msu")
   While archivo <> ""
       'para buscar el siguiente archivo se usa dir solo
       archivo = Dir
       CT = CT + 1
   Wend
   lblTotal.Caption = Str(CT)
   'CT es la cantidad de archivos


3:
Código (vb) [Seleccionar]
Dim archivo As String
   archivo = Dir("c:\*.msu")
   While archivo <> ""
       'shell ejecuta
       Shell archivo
       'Esperar a que cierre un proceso es mas complicado, busca en el foro.
       'ESTO EJECUTARA TODOS LOS MSU
       'para buscar el siguiente archivo se usa dir solo
       archivo = Dir
   Wend


4:
Código (vb) [Seleccionar]
Dim archivo As String
   archivo = Dir("c:\*.msu")
   While archivo <> ""
       'shell ejecuta msu
       Shell archivo
       'Suponemos que esperar al cierre del proceso es "EsperaCierre"
       While esperacierre(archivo) = False
           DoEvents
           'doevents libera el procesador y lo deja ejecutar otras operaciones
       Wend
       'para buscar el siguiente archivo se usa dir solo
       LblTerminados.Caption = Str(Val(LblTerminados.Caption +1))
       archivo = Dir
   Wend


En cuanto a lo ultimo, hay mucha info para reiniciar la pc, solo deberias fijarte en el label cuando sea = el de terminados y el de totales.

Conste que hago la "tarea" por que he visto a pitoloko (odio ese nick) y parece que tiene ganas de aprender.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

SuperDraco

#2
Gracias por tu tiempo, además con las explicaciones de lo que hace cada cosa ¡^^!  Trankilo, lo de pitoloko no es lo que te parece...  :P


voy por pasos, ya he arreglado el 1º, me ha costado un poco aunque al final he deducido como hacer funcionar mi string en tu ejemplo:

Código (vb) [Seleccionar]

If Dir(FName & "\*.msu") = vbNullString Then
   MsgBox "error no se encuentra archivo msu" & FName
End If



El resto no consigo utilizarlos, pero comentaré solo el 3º, me da error de que no encuentra el archivo (Pero el archivo si que existe en esa ruta)

C:\Users\Administrador\Desktop\Windows6.1-KB2492386-x64.msu


Código (vb) [Seleccionar]
Private Sub Command1_Click()
Dim archivo As String
   archivo = Dir("C:\Users\Administrador\Desktop\*.msu")
   While archivo <> ""
       Shell archivo
       archivo = Dir
   Wend
End Sub


¿Se te ocurre porque puede dar el error? :/

EDITO: ya se cual es el problema, "archivo" no coge el path entero, solamente el filename... ¿Como lo arreglo?  :xD No me deja utilizar el string FName... ese sería otro tema que me gustaría hablar, ¿Como guardo el string para usarlo en las demás funciones?

gracias por todo, iré aprendiendo
No he vuelto, solo estoy de paso.

raul338

Podes usar FSO. Aunque ya podes hacerlo asi, digamos

Código (vb) [Seleccionar]
Private Sub Command1_Click()
Const stPath As String = "C:\Users\Administrador\Desktop\"
'---
Dim archivo As String
    archivo = Dir(stPath & "*.msu")
    While archivo <> ""
        Call Shell(stPath & archivo)
        archivo = Dir
    Wend
End Sub

79137913

HOLA!!!

XD  :-X Eso me pasa por no testear.

Como dice raul hacelo asi tenes el path y el nombre de archivo.

FSO es lo mas lento que existe (ya se que dir no es rapido pero FSO es malisimo)

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

SuperDraco

Pues tampoco me funciona de la manera que dijo raul338  :-\

he probado:
msgbox stPath & archivo
Y la ruta es correcta, pero al usar:

Call Shell(stPath & archivo)

me da este error:

error '5'
llamada a procedimiento o argumento no válidos



PD: FSO = FSO file objects?
No he vuelto, solo estoy de paso.

79137913

#6
HOLA!!!

Es por que no reconoce a los Msu como archivos ejecutables...

Lo solucionas usando ShellExecute (un api de windows)

Declara esto:
Código (vb) [Seleccionar]
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long


Y en donde dice shell reemplaza por esto:
Código (vb) [Seleccionar]
       ShellExecute Me.hwnd, "open", stPath & archivo, vbNullString, "c:\", False
       'Nota el path de ejecucion es este ^


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

SuperDraco

Perdona por ser pesado, pero es que es un problema tras otro :(

me da error el shellexecute
Procedimiento sub o funcion no definido.

he probado usando End private sub, lo único que se me ha ocurrido, pero nada.

Ahora mismo lo tenog colocado así:
Código (vb) [Seleccionar]
Private Sub Command1_Click()

Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Const stPath As String = "C:\Users\Administrador\Desktop\"
Dim archivo As String
   archivo = Dir(stPath & "*.msu")
   While archivo <> ""
   MsgBox (FName & archivo)
        ShellExecute Me.hwnd, "open", stPath & archivo, vbNullString, "C:\Users\Administrador\Desktop\", False
       archivo = Dir
   Wend
End Sub
No he vuelto, solo estoy de paso.

79137913

#8
HOLA!!!

No hay problema estas empezando, las apis se declaran fuera de los procedimientos (ahi la tenes dentro del command1_click()) Te recomiendo ponerlas en la parte superior del codigo.

Nota, se declaran fuera de los procedimientos por que son funciones las cuales tienen sus propios procedimientos internos, osea, vos podes declarar variables pero no subs ni functions dentro de otros procesos.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

SuperDraco

Acabo de ponerlo arriba del todo, me sigue dando el mismo error  :xD


>:(

No he vuelto, solo estoy de paso.