Esta rotina possui varias caracteristicas que podem ser exploradas em seus aplicativos como compactação de arquivos, armazenamento de informações em arquivos .INI, trabalho em background como serviço.
O codigo foi preparado em Fivewin e pode muito bem ser adaptado para ser usado de outras formas pois trata-se de uma carcaça que faz uso da API do Windows e da biblioteca do Harbour HBZIP.
A primeira parte do codigo trate-se do coração:
Código: Selecionar todos
#include "FiveWin.ch"
#include "dll.ch"
#DEFINE WM_SYSCOMMAND 274 // &H112
#DEFINE SC_TASKLIST 61744 //&HF130
#DEFINE SC_SCREENSAVE 61760 // &HF140
#DEFINE SW_HIDE 0 // &H0
#DEFINE SW_SHOWNA 8 // &H8
#DEFINE SW_SHOW 5 // &H5
#DEFINE SW_SHOWNORMAL 1
#DEFINE SC_MONITORPOWER 61808 //&HF170 Gracias a Ramon Ramirez por la info
#DEFINE SM_CLEANBOOT 67
#DEFINE GWL_EXSTYLE (-20)
#DEFINE WS_EX_LAYERED 0x00080000
#DEFINE LWA_ALPHA 0x00000002
#DEFINE LWA_COLORKEY 0x00000001
#DEFINE GW_CHILD 5
#DEFINE GW_HWNDNEXT 2
#DEFINE RT_BITMAP 2
#DEFINE MB_ICONEXCLAMATION 48
#DEFINE CBM_INIT 4 && should move to prg header
#DEFINE DIB_RGB_COLORS 0 && should move to prg header
static hLib, hDib
Function Main(_tempo_)
Local oB, oApp, oIcon, oTimer, cImgFile := "service.bmp", oClp
public cUsuario := space(15), cImage, cIMGAlerta, oEsconde, cPath
Default _tempo_ := "05"
lBKPAlerta := .f.
lStatus := .f.
cPath := cFilePath( GetModuleFileName( GetInstance() ) )
if !file( cPath+"5vbackup.ini" )
NFWBackup()
endif
cBKPName := "BK"+strtran(dtoc(date()),"/","")+".ZIP"
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
cZIPEmail := VerifyINI( "BACKUP" , "Email" , "irochinha@itelefonica.com.br", cPath+"5vbackup.ini" )
cZIPFiles := VerifyINI( "BACKUP" , "Arquivos" , "*.DBF;*.DBT;*.FPT;*.ARR;*.ETI;*.FRM;*.HRB;*.VAL;*.DAT;*.INI", cPath+"5vbackup.ini" )
nZIPNivel := VerifyINI( "BACKUP" , "Nivel" , 8 , cPath+"5vbackup.ini" )
lOverWrite := VerifyINI( "BACKUP" , "Reescreve" , "S" , cPath+"5vbackup.ini" )
cPassword := VerifyINI( "BACKUP" , "PassWord" , Codifica("5volution") , cPath+"5vbackup.ini" )
cBKPAuto := VerifyINI( "BACKUP" , "AUTOMATICO", "N" , cPath+"5vbackup.ini" )
cBKPDest := VerifyINI( "BACKUP" , "DESTINO" , cPath , cPath+"5vbackup.ini" )
cBKPOrig := VerifyINI( "BACKUP" , "ORIGEM" , cPath , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "LEMBRAR" , "S" , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "PUBLICO" , "N" , cPath+"5vbackup.ini" )
nTempo := VerifyINI( "BACKUP" , "Tempo" , "005" , cPath+"5vbackup.ini" )
cBKPAlerta := VerifyINI( "BACKUP" , "Alerta" , "SIM" , cPath+"5vbackup.ini" )
cBKPHora := VerifyINI( "BACKUP" , "Hora" , "173000" , cPath+"5vbackup.ini" )
//---------------
ServiceProcess(1)
//---------------
DEFINE BRUSH oB COLOR CLR_HGRAY
DEFINE ICON oIcon FILE "LOGO.ICO"
DEFINE CLIPBOARD oClp OF oApp
//ShowWindow( FindWindow(nil,'Program Manager'), SW_SHOW)
//ShowWindow(FindWindow( 'Shell_TrayWnd',nil), SW_SHOWNA)
//if ! lStatus
// cBmp := "service.bmp"
// DEFINE BRUSH oBrush STYLE NULL
// DEFINE BITMAP oBmp FILENAME cBmp
// hDC := oBmp:hDC
// DEFINE WINDOW oEsconde FROM 0,0 TO 600,800 PIXEL BRUSH oBrush STYLE WS_POPUP
// ACTIVATE WINDOW oEsconde ON PAINT PalBmpDraw( hDC, 0, 0, oBmp:hBitmap )
//endif
DEFINE WINDOW oApp FROM 0,0 to 1,1 pixel TITLE "5Vbkpsvc" BRUSH oB STYLE WS_POPUP ICON "5Vbkpsvc.ico"
DEFINE TIMER oTimer OF oApp INTERVAL (val(nTempo)*1000) ACTION GravaProcess()
ACTIVATE TIMER oTimer
ACTIVATE WINDOW oApp ON INIT (Shell_NotifyIcon( 0, "5vbkpsvc.ico" ), oApp:Hide()) //VALID (oEsconde:End(), .t.)
ShowWindow( FindWindow(nil,'Program Manager'), SW_SHOW)
ShowWindow(FindWindow( 'Shell_TrayWnd',nil), SW_SHOWNA)
Return NIL
//-------------------------------------
Function GravaProcess()
//-------------------------------------
cPath := cFilePath( GetModuleFileName( GetInstance() ) )
cBKPHora := VerifyINI( "BACKUP" , "Hora" , "173000" , cPath+"5vbackup.ini" )
cBKPAlerta := VerifyINI( "BACKUP" , "Alerta" , "SIM" , cPath+"5vbackup.ini" )
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
cBKPOrig := VerifyINI( "BACKUP" , "ORIGEM" , cPath , cPath+"5vbackup.ini" )
cBKPDest := VerifyINI( "BACKUP" , "DESTINO" , cPath , cPath+"5vbackup.ini" )
if Val(TTOS(time())) > Val(cBKPHora)
if cBKPAlerta = "SIM"
if ! lBKPAlerta
lBKPAlerta := .t.
if MsgYesNo( "Backup de seguranca de hoje nao existe. Deseja efetuar o backup?", "Atencao" )
ZIPBackup()
endif
lBKPAlerta := .f.
endif
else
FErase(cBKPOrig+"\"+cZIPName)
ZIPBackup()
endif
endif
Return NIL
//-------------------------------------
Function ServiceProcess( mode )
//-------------------------------------
Local nProcessId := 0
Default mode := 0
nProcessId := GCP( )
If Abs( nProcessId ) > 0
RSProcess( nProcessId, mode )
Endif
RETURN
//-------------------------------------
Function Ballon(cBallonMsg,nBallonTime)
//-------------------------------------
local oDlgBallon, oBrush
default cBallonMsg := "Nova mensagem chegando..."
DEFINE WINDOW oDlgBallon ;
FROM GetSysMetrics(1),GetSysMetrics(0)-300 TO 200,200 PIXEL ;
COLOR nRGB(255,255,255),nRGB(255,255,230) ;
NO CAPTION BORDER NONE
@ 5, 5 GET cBallonMsg MEMO OF oDlgBallon SIZE 195,195 PIXEL COLOR nRGB(000,000,000),nRGB(255,255,230) NOBORDER NO MODIFY NO VSCROLL
//ACTIVATE WINDOW oDlgBallon ON INIT ( LayeredWindow( oDlgBallon, 070 ), MoveDLG(oDlgBallon,nBallonTime) )
ACTIVATE WINDOW oDlgBallon ON INIT MoveDLG(oDlgBallon,nBallonTime)
return nil
//-------------------------------------
Function LayeredWindow( oWnd, nLay )
//-------------------------------------
//SetWindowLong( oWnd:hWnd, GWL_EXSTYLE, GetWindowLong( oWnd:hWnd, GWL_EXSTYLE ) | WS_EX_LAYERED )
SetWindowLong( oWnd:hWnd, GWL_EXSTYLE, WS_BORDER )
SetWindowLong( oWnd:hWnd, GWL_EXSTYLE, WS_EX_LAYERED )
SetLayeredWindowAttributes( oWnd:hWnd, 0, ( 255 * nLay ) / 100, LWA_ALPHA )
Return NIL
//-------------------------------------
Function MoveDLG(oDlgBallon,oDlgTime)
//-------------------------------------
oDlgAltura := GetSysMetrics(1)
for i = 1 to 20
oDlgAltura := oDlgAltura - i
oDlgBallon:Move( oDlgAltura, 100, 200, 200, .t. )
SysWait(.02)
next
SysWait(oDlgTime)
for i = 1 to 20
oDlgAltura := oDlgAltura + i
oDlgBallon:Move( oDlgAltura, 100, 200, 200, .t. )
SysWait(.02)
next
oDlgBallon:end()
return
//-------------------------------------
Function HDSERIAL()
//-------------------------------------
return substr(alltrim(str(nSerialHD())),1,8)
//-------------------------------------
Function Ping(DestinationAddress)
//-------------------------------------
local IcmpHandle,Replicas
local RequestData:="Testando ping",;
RequestSize:=15,;
RequestOptions:="",;
ReplyBuffer:=space(278),;
ReplySize:=278,;
Timeout:=500 && Milisegundos de espera
default DestinationAddress := "10.10.10.3"
DestinationAddress:=left(alltrim(DestinationAddress)+space(15),15)
//MsgGet("Ping...","Introduzca dirección IP",@DestinationAddress)
IcmpHandle:=IcmpCreateFile()
Replicas:=IcmpSendEcho(IcmpHandle,;
inet_addr(DestinationAddress),;
RequestData,;
RequestSize,0,;
ReplyBuffer,;
ReplySize,;
Timeout)
IcmpCloseHandle(IcmpHandle)
if Replicas > 0
msginfo("A maquina "+alltrim(DestinationAddress)+" existe")
else
msginfo("A maquina "+alltrim(DestinationAddress)+" nao existe")
endif
return nil
//----------------------------------------------------
DLL32 FUNCTION RSProcess(npID AS LONG ,nMode AS LONG ) AS LONG FROM "RegisterServiceProcess" LIB "kernel32.DLL"
DLL32 FUNCTION GCP() AS LONG FROM "GetCurrentProcessId" LIB "kernel32.dll"
DLL32 STATIC FUNCTION FISAVE( nFormat AS LONG, hDib AS LONG, cFileName AS LPSTR, nFlags AS LONG ) AS BOOL PASCAL FROM "_FreeImage_Save@16" LIB hLib
//----------------------------------------------------
DLL32 FUNCTION WSAGetLastError() AS _INT PASCAL FROM "WSAGetLastError" LIB "wsock32.dll"
DLL32 FUNCTION inet_addr(cIP AS STRING) AS LONG PASCAL FROM "inet_addr" LIB "wsock32.dll"
DLL32 FUNCTION IcmpCreateFile() AS LONG PASCAL FROM "IcmpCreateFile" LIB "icmp.dll"
DLL32 FUNCTION IcmpCloseHandle(IcmpHandle AS LONG) AS LONG PASCAL FROM "IcmpCloseHandle" LIB "icmp.dll"
DLL32 FUNCTION IcmpSendEcho(IcmpHandle AS LONG,;
DestinationAddress AS LONG,;
RequestData AS STRING,;
RequestSize AS LONG,;
RequestOptions AS LONG,;
ReplyBuffer AS LPSTR,;
ReplySize AS LONG,;
Timeout AS LONG) AS LONG PASCAL FROM "IcmpSendEcho" LIB "icmp.dll"
#include "errorsys.prg"
function VerifyINI( _section_, _entry_, _var_, _inifile_, _grava_ )
oIni := TIni():New( _inifile_ )
if _grava_ = .t.
oIni:Set( _section_, _entry_, _var_ )
endif
return oIni:Get( _section_, _entry_, _var_, _var_ )
function codifica( _pass_ )
_senha_ := ''
for i = 1 to len(alltrim(_pass_))
_senha_ := _senha_ + chr(asc(substr(_pass_,i,1))+9)
next
return _senha_
function decodifica( _pass_ )
_senha_ := ''
for i = 1 to len(alltrim(_pass_))
_senha_ := _senha_ + chr(asc(substr(_pass_,i,1))-9)
next
return _senha_
function StringToArray( cString, cSeparator )
LOCAL nPos
LOCAL aString := {}
DEFAULT cSeparator := ";"
cString := ALLTRIM( cString ) + cSeparator
DO WHILE .T.
nPos := AT( cSeparator, cString )
IF nPos = 0
EXIT
ENDIF
AADD( aString, SUBSTR( cString, 1, nPos-1 ) )
cString := SUBSTR( cString, nPos+1 )
ENDDO
RETURN ( aString )
function ArrayToString( aArray, cSeparator )
LOCAL nPos
DEFAULT cSeparator := ";"
cString := ""
FOR nPos = 1 TO LEN(aArray)
cString := cString + aArray[nPos] + cSeparator
NEXT
RETURN ( cString )
function TTOS( cTime )
RETURN StrTran(cTime,":","")
#include "nfwhzip.prg"
A segunda parte do codigo:
Código: Selecionar todos
#include "FiveWin.ch"
FUNCTION NFWBackup()
local oDLGARQ, oGet, lGo := .f., lGrava := .t., lDireta := .t.
local lOverWrite:=.t., cPassword:="5volution"
local lCtrl101,nCtrl102:=15,lCtrl103,lCtrl104,lCtrl105,nCtrl106:=1,;
cCtrl107:="DIA(S)",nCtrl108:=1,cCtrl109:=SPACE(50)
cBKPName := "BK"+strtran(dtoc(date()),"/","")+".ZIP"
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
cZIPEmail := VerifyINI( "BACKUP" , "Email" , "irochinha@itelefonica.com.br", cPath+"5vbackup.ini" )
cZIPFiles := VerifyINI( "BACKUP" , "Arquivos" , "*.DBF;*.DBT;*.FPT;*.ARR;*.ETI;*.FRM;*.HRB;*.VAL;*.DAT;*.INI", cPath+"5vbackup.ini" )
nZIPNivel := VerifyINI( "BACKUP" , "Nivel" , 8 , cPath+"5vbackup.ini" )
lOverWrite := VerifyINI( "BACKUP" , "Reescreve" , "S" , cPath+"5vbackup.ini" )
cPassword := VerifyINI( "BACKUP" , "PassWord" , Codifica("5volution") , cPath+"5vbackup.ini" )
cBKPAuto := VerifyINI( "BACKUP" , "AUTOMATICO", "N" , cPath+"5vbackup.ini" )
cBKPDest := VerifyINI( "BACKUP" , "DESTINO" , cPath , cPath+"5vbackup.ini" )
cBKPOrig := VerifyINI( "BACKUP" , "ORIGEM" , cPath , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "LEMBRAR" , "S" , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "PUBLICO" , "N" , cPath+"5vbackup.ini" )
DEFINE DIALOG oDLGARQ NAME "dlgBackup"
//REDEFINE CHECKBOX oCtrl101 VAR lCtrl101 ID 101 OF oDLGARQ
//REDEFINE GET oCtrl102 VAR nCtrl102 ID 102 PICTURE "999" OF oDLGARQ WHEN lCtrl101 ;
// SPINNER ;
// ON UP (++nCtrl102,oCtrl102:Refresh()) ;
// ON DOWN (--nCtrl102,oCtrl102:Refresh())
REDEFINE GET oCtrl102 VAR cBKPOrig ID 102 PICTURE "@!" OF oDLGARQ WHEN nCtrl108=1
REDEFINE BUTTON ID 103 OF oDLGARQ ACTION ( cBKPOrig:=cGetDir("Pesquise no conjunto de pastas na caixa abaixo qual o diretorio contem os dados de que necessita","C:\"),oCtrl102:Refresh(),;
VerifyINI( "BACKUP", "DESTINO", cBKPOrig, cPath+"5vbackup.ini", .t. ),;
VerifyINI( "BACKUP", "ORIGEM" , cBKPOrig, cPath+"5vbackup.ini", .t. ) )
//REDEFINE CHECKBOX oCtrl105 VAR lCtrl105 ID 105 OF oDLGARQ
//REDEFINE GET oCtrl106 VAR nCtrl106 ID 106 PICTURE "999" OF oDLGARQ ;
// SPINNER ;
// ON UP (++nCtrl106,oCtrl106:Refresh()) ;
// ON DOWN (--nCtrl106,oCtrl106:Refresh())
//REDEFINE COMBOBOX oCtrl107 VAR cCtrl107 ITEMS { "Mese(s)", "Semana(s)", "Dia(s)", "Ano(s)" } OF oDLGARQ ID 107
REDEFINE BITMAP oBitMap ID 101 OF oDLGARQ RESOURCE "bmp006" //TRANSPAREN
REDEFINE BITMAP oBitMap ID 104 OF oDLGARQ RESOURCE "bmp006" //TRANSPAREN
REDEFINE BUTTON ID 105 OF oDLGARQ ACTION ZipBackup()
REDEFINE BUTTON ID 106 OF oDLGARQ ACTION ZipRestore()
REDEFINE BUTTON ID 107 OF oDLGARQ ACTION (lGo := .f., oDLGARQ:End())
ACTIVATE DIALOG oDLGARQ CENTERED
//VerifyINI( "BACKUP" , "Nome" , cZIPName , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "Email" , cZIPEmail , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "Arquivos" , cZIPFiles , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "Nivel" , nZIPNivel , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "Reescreve" , lOverWrite, cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "PassWord" , cPassword , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "AUTOMATICO", cBKPAuto , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "DESTINO" , cBKPDest , cPath+"5vbackup.ini", .t. )
//VerifyINI( "BACKUP" , "ORIGEM" , cBKPOrig , cPath+"5vbackup.ini", .t. )
return nil
FUNCTION ZIPBackup()
local oMeter
SET _3DLOOK ON
MsgMeter( { | oMeter, oText, oDlg, lEnd | ;
ZipIn(oMeter) },;
"Gerando arquivo compactado...", "Backup/Restore" )
Return .f.
FUNCTION ZipIn(oMeter)
local lOverWrite:=.t., cPassword:="5volution"
cBKPName := "BK"+strtran(dtoc(date()),"/","")+".ZIP"
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
cZIPEmail := VerifyINI( "BACKUP" , "Email" , "irochinha@itelefonica.com.br", cPath+"5vbackup.ini" )
cZIPFiles := VerifyINI( "BACKUP" , "Arquivos" , "*.DBF;*.DBT;*.FPT;*.ARR;*.ETI;*.FRM;*.HRB;*.VAL;*.DAT;*.INI", cPath+"5vbackup.ini" )
nZIPNivel := VerifyINI( "BACKUP" , "Nivel" , 8 , cPath+"5vbackup.ini" )
lOverWrite := VerifyINI( "BACKUP" , "Reescreve" , "S" , cPath+"5vbackup.ini" )
cPassword := VerifyINI( "BACKUP" , "PassWord" , Codifica("5volution") , cPath+"5vbackup.ini" )
cBKPAuto := VerifyINI( "BACKUP" , "AUTOMATICO", "N" , cPath+"5vbackup.ini" )
cBKPDest := VerifyINI( "BACKUP" , "DESTINO" , cPath , cPath+"5vbackup.ini" )
cBKPOrig := VerifyINI( "BACKUP" , "ORIGEM" , cPath , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "LEMBRAR" , "S" , cPath+"5vbackup.ini" )
VerifyINI( "BACKUP" , "PUBLICO" , "N" , cPath+"5vbackup.ini" )
aZipFiles := ProcessaArray( StringToArray( cZIPFiles, ";" ) )
oMeter:nTotal:=Len(aZIPFiles)
if file(cBKPOrig+"\"+cZIPName)
fErase(cBKPOrig+"\"+cZIPName)
if MsgYesNo( "Arquivo ("+cBKPName+") ja existe, Deseja re-escrever", "Atencao" )
Hb_ZIPFILE(cBKPOrig+"\"+cZIPName, aZIPFiles, nZIPNivel, {|cFile,nPos| (oMeter:Set(nPos),SysRefresh()) },lOverWrite )
endif
else
Hb_ZIPFILE(cBKPOrig+"\"+cZIPName, aZIPFiles, nZIPNivel, {|cFile,nPos| (oMeter:Set(nPos),SysRefresh()) },lOverWrite )
endif
return .t.
FUNCTION ZIPRestore()
local oMeter
SET _3DLOOK ON
MsgMeter( { | oMeter, oText, oDlg, lEnd | ;
ZipOut(oMeter) },;
"Descompactando arquivo...", "Backup/Restore" )
Return Nil
FUNCTION ZipOut(oMeter)
local lOverWrite:=.t., cPassword:="5volution"
cBKPName := "BK"+strtran(dtoc(date()),"/","")+".ZIP"
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
lOverWrite := VerifyINI( "BACKUP" , "Reescreve" , "S" , cPath+"5vbackup.ini" )
cPassword := DeCodifica(VerifyINI( "BACKUP" , "PassWord" , Codifica("5volution") , cPath+"5vbackup.ini" ))
cBKPDest := VerifyINI( "BACKUP" , "DESTINO" , cPath , cPath+"5vbackup.ini" )
oMeter:nTotal:=HB_GetFilesInZip( cZIPName )
HB_UNZIPFILE(cBKPDest+"\"+cZIPName,,lOverWrite,,cBKPDest)
return .t.
FUNCTION ProcessaArray( aQArray )
local aTArray := {}
for i = 1 to len( aQArray )
DBF_NOMES := array( ADIR( aQArray[i] ) )
ADIR( aQArray[i], DBF_NOMES )
for ii = 1 to len( DBF_NOMES )
AADD( aTArray, DBF_NOMES[ii] )
next
next
return aTArray
FUNCTION CheckBKP()
cBKPName := "BK"+strtran(dtoc(date()),"/","")+".ZIP"
cZIPName := VerifyINI( "BACKUP" , "Nome" , cBKPName , cPath+"5vbackup.ini", .t. )
cBKPOrig := VerifyINI( "BACKUP" , "ORIGEM" , cPath , cPath+"5vbackup.ini" )
if !file(cBKPOrig+"\"+cZIPName)
if Val(TTOS(time())) > 173000
if MsgYesNo( "Backup de seguranca de hoje nao existe. "+CRLF+"Deseja efetuar o backup?", "Atencao" )
ZIPBackup()
endif
endif
endif
return .t.
Código: Selecionar todos
dlgBackup DIALOG 10, 124, 269, 125
STYLE DS_MODALFRAME | 0x4L | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Gerenciar arquivos"
FONT 8, "MS Sans Serif"
{
EDITTEXT 102, 14, 51, 189, 12
PUSHBUTTON "Procurar...", 103, 207, 50, 50, 14
PUSHBUTTON "Fazer &Backup Agora", 105, 8, 106, 86, 14
PUSHBUTTON "&Restaurar Agora...", 106, 96, 106, 86, 14
PUSHBUTTON "Fechar", 107, 212, 106, 50, 14
CONTROL "", 101, "static", SS_BLACKRECT | WS_CHILD | WS_VISIBLE, 8, 5, 20, 20
CONTROL "", 104, "static", SS_BLACKRECT | WS_CHILD | WS_VISIBLE, 8, 76, 20, 20
LTEXT "Local atual:", -1, 15, 40, 106, 8
GROUPBOX "Local para backup e restauração", -1, 8, 29, 256, 42, BS_GROUPBOX
LTEXT "Faça o backup periódico de seus arquivos de dados em um local seguro. Dê preferencia a locais fora de seu disco rigido, como outro disco rígido, cd ou disco virtual na internet.", -1, 35, 74, 228, 27
LTEXT "Insira o local para backup ou restauração dos arquivos.", -1, 34, 3, 228, 27
}

