Hola foro...
intento hacer una pequeña aplicación para que me haga una copia de seguridad de una archivo en concreto (ese aechivo es un mdb) que uso con otra aplicación.
no tendría problemas si hago la copia cuando estoy trabajando con la aplicación principal... pero implicaría que siempre que quiera hacer una copia debería ejecutar esa aplicación.
Lo que me gustaria hacer es un procedimiento automático para que caba vez que se inicia el PC se ejecute ese procedimiento y se realice la copia de seguridad.
Por ejemplo que todos los días a las 12:00 me haga esa copia.
Para hacer esto es para lo que tengo problemas...
me podeis echar una mano??? y guiarme para ver por donde van los tiros?
un saludo.
Creo que te puedo dar la solucion.
Para que se te ejecute en el inicio vas a escribir en la entrada de registro "HKEY_LOCAL_MACHINE\software\microsoft\windows\currentversion\run". Esto lo puedes hacer con la API RegSetValueEx.
Para que sea a una hora en concreto lo vas a hacer con la API GetSystemTime y comparando el valor que te devuelve con la hora que tu quieras.
Creo que con eso tienes el problema solucionado.
Si tienes alguna duda al respecto pregunta.
Muchas gracias Gorky, probaré con la API.
Voy a buscar información sobre esas funciones y lo pruebo.
Es la primera vez que trabajo con esto del registro..... no comprendo como tengo que usar RegSetValueEx y GetSystemTime...
podrias ponerme un ejemplo de como hacerlo? y donde tengo que hacerlo? ya que si lo hago en mi aplicación... si no la ajecuto no se creará la copia de seguridad....
perdona, pero ando bastante perdido en este tema.
Bajate esto y te informas: http://www.allapi.net/downloads/apiguide/agsetup.exe
Si despues sigues teniendo dudas vuelves a preguntar.
PD.: Entre una respuesta tuya y otra hay muy poco tiempo y dudo mucho que te haya dado tiempo a poder investigar. Es lo primero que deberias ponerte a hacer.
mira yo tengo algo parecido, solo que uso una base de datos del SQL
'Apis
'==================================
Public Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
'PROCESOS
Public Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
'PAUSA
Public Declare Function GetTickCount Lib "Kernel32.dll" () As Long
Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400
Private Sub cmdRespaldo_Click()
'Determinar el nombre de la base de datos
Dim b As Long, strPath As String * 255
Dim Archivo As String
On Local Error Resume Next
b = GetShortPathName(fbDir.Text, strPath, Len(strPath))
strPath = Left$(strPath, b)
If Trim(strPath) = "" Then
MsgBox "Directorio no valido", vbCritical + vbOKOnly, App.EXEName
Exit Sub
End If
GetAttr (Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy") & ".zip")
If Err.Number = 0 Then
b = MsgBox("¿El archivo de respaldo ya existe, desea sobreescribirlo?", vbQuestion + vbYesNoCancel, App.EXEName)
Select Case b
Case 6 ' Si
Archivo = Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy")
Case 7 ' No
Archivo = InputBox("Teclee el nombre del archivo de respaldo (sin extensión).", "Crear Respaldo", "")
If Trim(Archivo) = "" Then
Exit Sub
Else
Archivo = Trim(strPath) & Archivo
End If
Case 2 ' Cancelar
Exit Sub
End Select
Else
Archivo = Trim(strPath) & "Respaldo" & Format(Date, "ddMMyyyy")
End If
'Exit Sub
If AbrirBD(Acceso.LecturaEscritura) <> 0 Then Exit Sub
'Crear respaldo de la base de datos
On Local Error Resume Next
lblProgres.Caption = "Creando copia de seguridad..."
ProgressBar1.Value = 1
DoEvents
BD.Execute "BACKUP DATABASE [Indicadores] TO DISK = N'" & Archivo & ".bak ' " & _
"WITH NOINIT, NOUNLOAD, NAME = N'Respaldo" & Format(Date, "ddMMyyyy") & "', " & _
"NOSKIP, STATS = 10, DESCRIPTION = N'Respaldo', NOFORMAT"
DoEvents
If Err Then
MsgBox BD.Errors(0).Number & vbCrLf & BD.Errors(0).Description, vbCritical + vbOKOnly, App.EXEName
Else
' Coomprimir la base de datos .bak
lblProgres.Caption = "Comprimiendo archivo..."
ProgressBar1.Value = 2
DoEvents
'Ejecuta el comando MSDOS
ExeEspera "c:\archiv~1\winzip\winzip32.exe -a -r " & Archivo & ".zip " & Archivo & ".bak"
lblProgres.Caption = "Borrando archivos temporales..."
ProgressBar1.Value = 3
DoEvents
Kill Archivo & ".bak"
lblProgres.Caption = "Proceso terminado"
ProgressBar1.Value = 4
DoEvents
End If
On Local Error GoTo 0
CerrarBD
End Sub
Private Function ExeEspera(COMANDO As String)
Dim hProcess As Long
Dim RetVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, Shell(COMANDO, vbMinimizedNoFocus))
Do
GetExitCodeProcess hProcess, RetVal
DoEvents
Pausa 100
Loop While RetVal = STILL_ACTIVE
End Function
Sigo liado con esto y no consigo sacar nada en claro, podrias ponerme un ejemplo de como hacerlo? y donde tengo que hacerlo? ya que si lo hago en mi aplicación... si no la ajecuto no se creará la copia de seguridad....
ando algo perdido en esto
y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
Cita de: CeLaYa en 13 Noviembre 2006, 19:04 PM
y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
está deberá ser la solución, ya que no consigo controlar que me me propuso Gorky.
Cita de: jrhomer en 15 Noviembre 2006, 10:35 AM
Cita de: CeLaYa en 13 Noviembre 2006, 19:04 PM
y es muy necesario que lo tengas que programar??. porque no lo haces desde el programador de tareas del Windows?
está deberá ser la solución, ya que no consigo controlar que me me propuso Gorky.
Venga te lo facilito un poco.
Esto lo tienes que colocar en la cabecera, antes de Option Explicit:
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Sub GetSystemTime Lib "kernel32" Alias "GetSystemTime" (lpSystemTime As SYSTEMTIME)
Private Const HKEY_LOCAL_MACHINE = &H80000002
Y esto en el cuerpo:
Dim h As Long
Dim buffer As String
RegOpenKey HKEY_LOCAL_MACHINE, "software\microsoft\windows\currentversion\run", h
RegSetValueEx h, "nombre_de_la_entrada", 0, 1, ByVal "C:\WINDOWS\system32\programa.exe", Len("C:\WINDOWS\system32\programa.exe")
RegCloseKey h
Con eso haces que se te ejecute en cada inicio.
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Dim MyTime As Tiempo
GetLocalTime Tiempo
If Tiempo.wDay = 12 And Tiempo.wMinute = 0 Then
FileCopy App.Path & "\" & App.EXEName & ".exe", "C:\WINDOWS\system32\programa.exe"
End If
Y con eso haces que a las doce se te copie en la ruta que le hayas dicho.
Ya por co***es tienes que saber hacerlo. De todas formas si no lo consigues pregunta de nuevo.