Mein erstes Programm in PB - Zum syncen von Verzeichnissen

Anwendungen, Tools, Userlibs und anderes nützliches.
Zomtec
Beiträge: 33
Registriert: 07.06.2005 14:46
Wohnort: Bayern
Kontaktdaten:

Mein erstes Programm in PB - Zum syncen von Verzeichnissen

Beitrag von Zomtec »

Hallo Leute,

ich beschäftige mich seit etwa Mitte Dezember '05 mit PB und bin stolz, heute mein erstes funktionierendes Programm zu präsentieren: HandlCopy :)

Das Programm dient zum Abgleich von zwei Verzeichnissen und setzt auf das Tool Robocopy aus dem Windows Server 2003 Resource Kit, das hier auch einzeln heruntergeladen werden kann. Die Robocopy.exe muss im gleichen Verzeichnis wie die HandlCopy.exe sein.

Mein Programm und die Source dazu gibt es hier: HandlCopy

Über Feedback insbesondere über die Strukturierung meines Sources bin ich dankbar.

Noch eine kleine WARNUNG: Robocopy ist ein mächtiges Tool von MS, das bei ein paar falschen Parametern schon mal 'ne Festplatte löscht, also Vorsicht bei der Verwendung!
Zuletzt geändert von Zomtec am 04.02.2006 22:21, insgesamt 2-mal geändert.
mfg
Zomtec
------------
noch PB 3.94
Zomtec
Beiträge: 33
Registriert: 07.06.2005 14:46
Wohnort: Bayern
Kontaktdaten:

Beitrag von Zomtec »

Wollte das Thema nochmal nach oben schieben. Da es mein erstes Programm ist, würde ich mich über Feedback, insbesondere ob der Code von der Strukturierung her in Ordnung ist, sehr freuen. Meine Programmiererfahrungen stammen aus C64/Amiga-Zeiten, da gab's sowas wie Prozeduren noch nicht. ;)

Falls ich mit meiner Warnung einige davon abgehalten habe, das Programm zu testen. Es geht auch ohne die Robocopy.exe, kopieren funktioniert dann natürlich nicht. Aber die Oberfläche ist voll funktionsfähig. :)

Hier ist mal ein Screenshot:
Bild
mfg
Zomtec
------------
noch PB 3.94
Zomtec
Beiträge: 33
Registriert: 07.06.2005 14:46
Wohnort: Bayern
Kontaktdaten:

Beitrag von Zomtec »

Hier der Quellcode (3.94), falls ihn jmd. brauchen kann:

HandlCopyMain.pb

Code: Alles auswählen

; PureBasic Visual Designer v3.92 build 1460

#Version$="HandlCopy 1.07-20022006"
#updater$="updater 1.01"

IncludeFile "HandlCopyInclude.pb"

Open_Window_0() ;Fenster öffnen

SetzeGadgetStatus() ;Standardwerte auf Gadgets anwenden
FileCheck() ;Auf vorhandene Dateien überprüfen

MainLoop:
Repeat ; Start of the event loop
  
  Event = WaitWindowEvent() ; This line waits until an event is received from Windows
  
  WindowID = EventWindowID() ; The Window where the event is generated, can be used in the gadget procedures
  
  GadgetID = EventGadgetID() ; Is it a gadget event?
  
  EventType = EventType() ; The event type
  
  MenuID = EventMenuID()
  
  ;You can place code here, and use the result as parameters for the procedures
  
  ;MenuEvents ueberpruefen
  If Event = #PB_EventMenu
    Select MenuID
      Case #MENU_4
        ReadConfig()
        SetzeGadgetStatus()
      Case #MENU_5
        SchreibeConfig()
      Case #MENU_9
        CheckQuit()
      Case #MENU_11
        MessageRequester("Einstellungen", "Alle Optionen können im Hauptfenster eingestellt werden.")
      Case #MENU_12
        Hilfe()
      Case #MENU_13
        AboutMessage()
      Case #MENU_update
        UpdateCheck()
    EndSelect
  EndIf
  
      
  If Event = #PB_EventGadget
    Select GadgetID  
      Case #Button_FileRequest1
        VerzQuelle(0)
      Case #Button_FileRequest2
        VerzQuelle(1)
      Case #String_FileRequest1
        CheckDirectory(#String_FileRequest1,0,EventType)
      Case #String_FileRequest2
        CheckDirectory(#String_FileRequest2,1,EventType)     
      Case #Combo_Kopierrichtung
        Kopierrichtung()
      Case #Button_Start
        StartKopie()
      Case #Button_Ende
        CheckQuit()
      Case #Button_MakeDefault
        LeseDefaultOptions()
        SetzeGadgetStatus()
      Case #String_RoboParameter
        RoboParameter(EventType)
      Case #CheckBox_NTFSrechte
        LeseCheckBox(#CheckBox_NTFSrechte,3)
        CheckNtfs()
      Case #CheckBox_Save
        LeseCheckBox(#CheckBox_Save,4)
      Case #CheckBox_Log
        LeseCheckBox(#CheckBox_Log,10)
        CheckLog()
      Case #CheckBox_QuestEnd
        LeseCheckBox(#CheckBox_QuestEnd,5)
      Case #CheckBox_QuestStart
        LeseCheckBox(#CheckBox_QuestStart,6)
    EndSelect
  EndIf
  
  If Event = #PB_Event_CloseWindow
    CheckQuit()
  EndIf
  
ForEver; End of the event loop

Ende: ;hier ist der Anfang vom Ende ;-)
End
;

; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 3
; Folding = -
; Executable = ..\MeineExecutes\HandlCopy\HandlCopy.exe
HandlCopyInclude.pb

Code: Alles auswählen

;
; PureBasic Visual Designer v3.92 build 1460

;Programmkonstante
#OptionenAnzahl = 20

;Prozeduren deklarieren um sie sofort benutzen zu können
Declare.s GetExePath() : Declare ReadConfig() : Declare SchreibeConfig()
Declare MessageBoxH(parentWindow, title.s, message.s,flags)
Declare LeseDefaultOptions()
Declare BalloonTip(WindowID, Gadget, Text$ , Title$, Icon)
Declare CheckDirExist()
Declare.s GetTempPath()
Declare FileCheck()

;Globale Variable
Global OptionCounter.b, StammVerzeichnis$, mbHook.l, hThreadId.l, Url.s

StammVerzeichnis$=GetExePath()
Url.s = "http://home.arcor.de/pb_zomtec/hc/"

;Variable für die Konfig-Datei dimensionieren
Dim HCini.s(#OptionenAnzahl) : Dim Keyword$(#OptionenAnzahl) : Dim StandardWert$(#OptionenAnzahl)

LeseDefaultOptions()
ReadConfig()
CheckDirExist()

;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration

;- MenuBar Constants

Enumeration
  #MenuBar_0
EndEnumeration

Enumeration
  #MENU_4
  #MENU_5
  #MENU_9
  #MENU_11
  #MENU_12
  #MENU_13
  #MENU_update
EndEnumeration

; BalloonTip Constants 
Enumeration
#TOOLTIP_NO_ICON
#TOOLTIP_INFO_ICON
#TOOLTIP_WARNING_ICON
#TOOLTIP_ERROR_ICON
EndEnumeration 

;- Gadget Constants
;
Enumeration
  #String_FileRequest1  ;0    Kommentierte GadgetConstants müssen in der festen Position
  #String_FileRequest2  ;1    bleiben, da dies für den späteren Programmablauf notwendig ist
  #ExplorerCombo_0      ;2
  #CheckBox_NTFSrechte  ;3
  #CheckBox_Save        ;4
  #CheckBox_QuestEnd    ;5
  #CheckBox_QuestStart  ;6
  #CheckBox_Log
  #Text_0
  #Text_1
  #Text_3
  #ExplorerCombo_1
  #Combo_Kopierrichtung
  #Button_Start
  #Button_Ende
  #Frame3D_0
  #Button_MakeDefault
  #Text_Parameter
  #String_RoboParameter
  #Text_ParamterWarning
  #Button_FileRequest1
  #Button_FileRequest2
EndEnumeration

;- Fonts
Global FontID1
FontID1 = LoadFont(1, "Arial", 18)
Global FontID2
FontID2 = LoadFont(2, "Arial", 12)
Global FontID3
FontID3 = LoadFont(3, "Arial", 16)
Global FontID4
FontID4 = LoadFont(4, "Arial", 8, #PB_Font_Bold)
Global FontID5
FontID5 = LoadFont(5, "Arial", 9)
Global FontID6
FontID6 = LoadFont(6, "Arial", 9, #PB_Font_Bold)
Global FontID7
FontID7 = LoadFont(3, "Arial", 8)
Global FontID8
FontID8 = LoadFont(2, "Arial", 10, #PB_Font_Bold)

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 642, 482,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar , #Version$)
    If CreateMenu(#MenuBar_0, WindowID())
      MenuTitle("Datei")
      MenuItem(#MENU_4, "Öffnen")
      MenuItem(#MENU_5, "Speichern")
      MenuBar()
      MenuItem(#MENU_9, "Beenden")
      MenuTitle("Bearbeiten")
      MenuItem(#MENU_11, "Einstellungen")
      MenuTitle("?")
      MenuItem(#MENU_12, "Hilfe")
      MenuItem(#MENU_update, "Auf Update prüfen...")
      MenuItem(#MENU_13, "Über")
      EndIf

      If CreateGadgetList(WindowID())
        TextGadget(#Text_0, 5, 0, 470, 30, HCini.s(8))
          SetGadgetFont(#Text_0, FontID1)
        
        StringGadget(#String_FileRequest1, 120, 30, 510, 22, HCini.s(0))
          SetGadgetFont(#String_FileRequest1, FontID2)
        
        ButtonGadget(#Button_FileRequest1, 10, 30, 100, 22, "Ordner wählen...")
         
        TextGadget(#Text_1, 5, 70, 470, 30, HCini.s(9))
          SetGadgetFont(#Text_1, FontID1)
        
        StringGadget(#String_FileRequest2, 120, 100, 510, 22, HCini.s(1))
          SetGadgetFont(#String_FileRequest2, FontID2)
        
        ButtonGadget(#Button_FileRequest2, 10, 100, 100, 22, "Ordner wählen...")
                
        ComboBoxGadget(#Combo_Kopierrichtung, 95, 140, 450, 115)
          SetGadgetFont(#Combo_Kopierrichtung, FontID2)
            AddGadgetItem(#Combo_Kopierrichtung, 0, "Vom PC auf USB-Stick/Festplatte kopieren")
            AddGadgetItem(#Combo_Kopierrichtung, 1, "Von USB-Stick/Festplatte auf PC kopieren")

        ButtonGadget(#Button_Start, 20, 400, 140, 40, "Starten")
          SetGadgetFont(#Button_Start, FontID3)
        
        ButtonGadget(#Button_Ende, 480, 400, 140, 40, "Beenden")
          SetGadgetFont(#Button_Ende, FontID3)
        
        Frame3DGadget(#Frame3D_0, 40, 190, 550, 185, "Einstellungen:")
          SetGadgetFont(#Frame3D_0, FontID2)
      
        ButtonGadget(#Button_MakeDefault, 50, 210, 140, 20, "Auf Standard zurücksetzen")
      
        CheckBoxGadget(#CheckBox_NTFSrechte, 50, 240, 300, 15, "NTFS-Rechte kopieren")
      
        CheckBoxGadget(#CheckBox_Save, 50, 260, 300, 15, "Einstellungen beim Beenden speichern")
      
        CheckBoxGadget(#CheckBox_Log, 50, 280, 330, 15, "Log-Datei erstellen")
      
        CheckBoxGadget(#CheckBox_QuestEnd, 350, 240, 235, 15, "Sicherheitsabfrage beim Beenden")
      
        CheckBoxGadget(#CheckBox_QuestStart, 350, 260, 235, 15, "Sicherheitsabfrage vor dem Kopieren")
      
        TextGadget(#Text_Parameter, 50, 305, 150, 20, "Robocopy Parameter:")
          SetGadgetFont(#Text_Parameter, FontID6)
      
        StringGadget(#String_RoboParameter, 50, 325, 280, 20, HCini.s(7))
          Tooltip$="ACHTUNG! Die Standardkopierparameter sind auf Mirror gesetzt, das Quell-"
          Tooltip$+Chr(10)+"verzeichnis wird also ins Zielverzeichnis gespiegelt, d. h. evtl. vorhandene"
          Tooltip$+Chr(10)+"Dateien/Ordner im Zielverzeichnis werden überschrieben/gelöscht, sofern sie"
          Tooltip$+Chr(10)+"im Quellverzeichnis vorhanden/nicht vorhanden sind!" 
          BalloonTip(#Window_0, #String_RoboParameter, Tooltip$, "Wichtiger Hinweis!", #TOOLTIP_WARNING_ICON)
      
        TextGadget(#Text_ParamterWarning, 50, 350, 370, 20, "(Warnung! Die Syntax wird nicht geprüft! Du solltest also wissen was du tust!)")
        
      EndIf
    EndIf
EndProcedure

Procedure CheckQuit()
  If HCini.s(5)="0"
    If HCini.s(4)="1" : SchreibeConfig() : EndIf
    End
  ElseIf MessageRequester("Beenden?", "Willst Du wirklich beenden?",#PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes
    If HCini.s(4)="1" : SchreibeConfig() : EndIf
    End
  EndIf
EndProcedure

Procedure AboutMessage()
  a$=Chr(169)+" Jan. 2006 by Baumi"+Chr(10)+Chr(10)
  a$+"Email: pb_zomtec@arcor.de"+Chr(10)+"Homepage: http://home.arcor.de/pb_zomtec/hc/"
  a$+Chr(10)+Chr(10)+"HandlCopy ist Freeware"
  a$+Chr(10)+Chr(10)+"Feel free to use and copy it..."
  MessageBoxH(0, a$, #version$,#MB_OK)
EndProcedure

Procedure.s GetExePath() ;aktuelles .exe-Verzeichnis ermitteln
  ;#MAX_PATH=260, max. Pfadlänge
  Prg.s = Space(#MAX_PATH) 
  GetModuleFileName_(GetModuleHandle_(0), @Prg, #MAX_PATH)
  Prg = GetPathPart(Prg)
  If (FindString(prg,"\PureBasic\Compilers\", 1))
    Prg.s = Space(#MAX_PATH)
    GetCurrentDirectory_(#MAX_PATH,@Prg)
  EndIf
  If Right(Prg, 1) <> "\" : Prg + "\" : EndIf
  ProcedureReturn Prg
EndProcedure

;Preferences lesen
Procedure ReadConfig()
  OpenPreferences(StammVerzeichnis$+"HC.ini")
    For k=0 To OptionCounter
      HCini.s(k) = ReadPreferenceString(Keyword$(k), StandardWert$(k))
    Next k
  ClosePreferences()
EndProcedure

;Preferences schreiben 
Procedure SchreibeConfig()
  If CreatePreferences(StammVerzeichnis$+"HC.ini") 
    For k=0 To OptionCounter
      WritePreferenceString(Keyword$(k), HCini.s(k))
    Next k 
    ClosePreferences()
  EndIf
EndProcedure

Procedure VerzQuelle(wert)
  FileRequest$ = PathRequester("Ordner auswählen", HCini.s(wert))
  If FileRequest$<>""
    If Right(FileRequest$, 1) = "\" : FileRequest$=Left(FileRequest$, Len(FileRequest$)-1) : EndIf
      If wert=0
        SetGadgetText(#String_FileRequest1, FileRequest$)
      Else
        SetGadgetText(#String_FileRequest2, FileRequest$)  
      EndIf
      HCini.s(wert)=FileRequest$
  EndIf
EndProcedure

;CheckBox auslesen und HCini.s setzen
Procedure LeseCheckBox(GadgetNr,arraynr)
  If GetGadgetState(GadgetNr) = 0
    HCini.s(arraynr)="0"
  Else
    HCini.s(arraynr)="1"
  EndIf
EndProcedure

Procedure CheckLog()
  a$ = GetGadgetText(#String_RoboParameter)
  a$ = RemoveString(a$, " /LOG:HandlCopy_log.txt", 1)
  a$ = RemoveString(a$, "/LOG:HandlCopy_log.txt", 1)
    
  If HCini.s(10)="1"
    a$ + " /LOG:HandlCopy_log.txt"
  EndIf
  
  SetGadgetText(#String_RoboParameter,a$)
  HCini.s(7)=a$
EndProcedure

Procedure CheckNtfs()
  a$=GetGadgetText(#String_RoboParameter)
  a$ = RemoveString(a$, " /COPYALL", 1)   ;zuerst alle Parameter entfernen
  a$ = RemoveString(a$, " /COPY:DAT", 1)  ;mit " " falls nicht am Anfang des Strings
  a$ = RemoveString(a$, "/COPYALL", 1)
  a$ = RemoveString(a$, "/COPY:DAT", 1)
  
  If HCini.s(3)="0"
    If FindString(a$, "/COPYALL", 1) <> 0 ;und nun je nach CheckBoxAuswahl wieder hinzufügen
      a$=ReplaceString(a$, "/COPYALL", "/COPY:DAT", 1)
    Else
      a$+" /COPY:DAT"
    EndIf
  ElseIf HCini.s(3)="1"
    If FindString(a$, "/COPY:DAT", 1) <> 0
      a$=ReplaceString(a$, "/COPY:DAT", "/COPYALL", 1)
    Else
      a$+" /COPYALL"
    EndIf
  EndIf
  
  SetGadgetText(#String_RoboParameter,a$)
  HCini.s(7)=a$
EndProcedure

;Prüfen ob Verzeichnis existiert
Procedure CheckDirectory(StringFileRequest,arraynr,EventType)
If EventType=#PB_EventType_LostFocus ;Prüfung wird erst durchlaufen, wenn StringGadget verlassen wird
  file$ = GetGadgetText(StringFileRequest) 

  If Right(file$, 1) = "\" : file$=Left(file$, Len(file$)-1) : EndIf
  
  If FileSize(file$)=-2 And file$<>HCini.s(arraynr)    ;-2 = Directory existiert
    HCini.s(arraynr)=file$
    SetGadgetText(StringFileRequest, HCini.s(arraynr))
  EndIf
EndIf
EndProcedure

Procedure CheckDirExist()
  For k=0 To 1
    If FileSize(HCini.s(k))<>-2    ;Directory existiert nicht od. ist Datei
      HCini.s(k)=GetTempPath()
    EndIf
  Next k
EndProcedure

  Procedure.s GetTempPath() 
    Protected Result.s 
    Result = Space(#MAX_PATH) 
    GetTempPath_(#MAX_PATH, @Result) 
    If Right(Result,1) <> "\" : Result + "\" : EndIf 
    ProcedureReturn Result
  EndProcedure

;Defaultwerte einlesen
Procedure LeseDefaultOptions()
  OptionCounter=0
  Restore DefaultOptions
  Repeat
    Read Keyword$(OptionCounter)
    Read StandardWert$(OptionCounter)
    HCini.s(OptionCounter)=StandardWert$(OptionCounter)
    OptionCounter + 1
  Until Keyword$(OptionCounter-1)="ende"
EndProcedure

;Standardeinstellungen auf Gadgets anwenden
Procedure SetzeGadgetStatus()
  For k=#String_FileRequest1 To #String_FileRequest2
    If FileSize (HCini.s(k))=-2
      SetGadgetText(k, HCini.s(k))
    Else
      SetGadgetText(k, "C:\")
    EndIf
  Next k
  
  If HCini.s(2)="pc->usb"       ;Standardwert setzen
    SetGadgetState(#Combo_Kopierrichtung, 0)
  Else
    SetGadgetState(#Combo_Kopierrichtung, 1)
  EndIf
  
  For k=#CheckBox_NTFSrechte To #CheckBox_QuestStart
    If HCini.s(k)="0"
      SetGadgetState(k, 0)
    Else
      SetGadgetState(k, 1)
    EndIf
  Next k
  
  If HCini.s(10)="0"      ;10 = #CheckBox_Log
    SetGadgetState(#CheckBox_Log, 0)
  Else
    SetGadgetState(#CheckBox_Log, 1)
  EndIf
  
  SetGadgetText (#String_RoboParameter, HCini.s(7))
EndProcedure

Procedure Kopierrichtung()
  k=GetGadgetState(#Combo_Kopierrichtung)
  If k=0
    HCini.s(2)="pc->usb"
  ElseIf k=1
    HCini.s(2)="usb->pc"
  EndIf
EndProcedure

Procedure StartKopie()
  If HCini.s(2)="pc->usb"
    Quelle$=HCini.s(0) : Ziel$=HCini.s(1)
  Else
    Quelle$=HCini.s(1) : Ziel$=HCini.s(0)
  EndIf
  ;mit Chr(34) Anführungszeichen vor die Pfade, damit auch Verzeichnisse
  ;mit Leerzeichen funktionieren
  parameter$ + " " + Chr(34) + Quelle$ + Chr(34) + " " + Chr(34) + Ziel$ + Chr(34) + " " + HCini.s(7)

  If HCini.s(6)="1"
    a$="Robocopy.exe wird mit folgenden Parametern gestartet:"
    a$+Chr(10)+Chr(10)+parameter$
    a$+Chr(10)+Chr(10)+"!!!ACHTUNG!!!"
    a$+Chr(10)+"Die Standardkopierparameter sind auf Mirror gesetzt,"
    a$+Chr(10)+"das Quellverzeichnis ("+Quelle$+")"
    a$+Chr(10)+"wird also ins Zielverzeichnis ("+Ziel$+")"
    a$+Chr(10)+"gespiegelt, d. h. evtl. vorhandene Dateien/Ordner in "
    a$+Chr(10)+Ziel$+" werden überschrieben/gelöscht, sofern sie"
    a$+Chr(10)+"in "+Quelle$+" vorhanden/nicht vorhanden sind!" 
    a$+Chr(10)+Chr(10)+"Soll HandlCopy den Kopiervorgang jetzt starten?"
    a=MessageBoxH(0, a$, "Kopiervorgang starten?",#MB_YESNO)
  EndIf
  
  If a=6  ;6 = ja
    If RunProgram(StammVerzeichnis$+"robocopy.exe", parameter$, StammVerzeichnis$, 1)
      ;MessageRequester("Kopie gestartet", "Robocopy erfolgreich gestartet")
      If RunProgram("notepad.exe", StammVerzeichnis$+"HandlCopy_log.txt",StammVerzeichnis$) : EndIf
    Else
      a$="Robocopy konnte nicht gestartet werden!"
      a$+Chr(10)+Chr(10)+"Ist die Robocopy.exe im Ordner"+Chr(10)
      a$+StammVerzeichnis$+Chr(10)+" vorhanden?"+Chr(10)+Chr(10)
      a$+"Robocopy.exe ist "+Chr(169)+" by Microsoft und Bestandteil des Windows Server 2003 Resource Kit Tools,"
      a$+" das hier:"+Chr(10)
      a$+"http://www.microsoft.com/downloads/details.aspx?familyid=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en"
      a$+Chr(10)+"heruntergeladen werden kann."
      MessageBoxH(0, a$, "Fehler!",#MB_OK)
    EndIf
  EndIf
EndProcedure

Procedure RoboParameter(EventType)
  If EventType=#PB_EventType_LostFocus ;Prüfung wird erst durchlaufen, wenn StringGadget verlassen wird
    HCini(7)=GetGadgetText(#String_RoboParameter)
    SetzeGadgetStatus()
  EndIf
EndProcedure

Procedure Hilfe()
  If OpenHelp(StammVerzeichnis$+"\HandlCopy.chm", "Überblick")
  ElseIf MessageBoxH(0, "Hilfedatei HandlCopy.chm nicht gefunden!"+Chr(10)+Chr(10)+"Datei kann hier heruntergeladen werden: http://home.arcor.de/pb_zomtec/hc/HandlCopy.chm", "Fehler!",#MB_OK)
  EndIf
EndProcedure

Procedure UpdateCheck()
  Version_datei$ = StammVerzeichnis$ + "version.txt"
  ;version.txt vom Server laden:
  URLDownloadToFile_(0, URL.s + "version.txt", Version_datei$, 0, 0)
  If ReadFile(0, Version_datei$)  ;version.txt auslesen
    Versionsnummer$ = ReadString()  ;versionsnr. von Handlcopy
    Versionupdater$ = ReadString()  ;versionsnr. der update.exe
    CloseFile(0)
    If Versionsnummer$ <> #Version$ Or Versionupdater$ <> #updater$ ;Serverversionen mit lokalen vergleichen
      a$ = "Neue Version vorhanden!" + Chr(10) + Chr(10)
      a$ + "Soll ich die neue Version herunterladen und installieren?" + Chr(10) + Chr(10)
      a$ + "Bestehende Internetverbindung erforderlich!"
      a = MessageBoxH(0, a$, "Updatecheck",#MB_YESNO)
      If a=6 ;6 = ja
        If Versionupdater$ <> #updater$
          URLDownloadToFile_(0, URL.s + "update.exe", StammVerzeichnis$ + "update.exe", 0, 0) ;neue update.exe-Version vom Server laden
        ElseIf Versionsnummer$ <> #Version$
          exename$ = "HandlCopy.exe"
          PID$ = Str(GetProcessPID(exename$))  ;PID von .exe mit PBOSL ermitteln
          ;Übergabeparameter
          a$ = StammVerzeichnis$ + " "  ;.exe-Startverzeichnis
          a$ + PID$ + " "               ;PID der .exe als String
          a$ + URL.s + " "              ;Download-URL des Updates
          a$ + exename$                 ;Name der zu updatenden .exe (incl. .exe-Extension)
          If RunProgram(StammVerzeichnis$+"update.exe", a$, "")
            HCini.s(5)="0"  ;Sicherheitsabfrage beim beenden abschalten
            Delay(3000)
            CheckQuit()
          Else
            a$ = "Update.exe nicht gefunden!" + Chr(10) + Chr(10)
            a$ + "update.exe ist für's Update erforderlich." + Chr(10) + Chr(10)
            a$ + "Im nächsten Dialog kannst du sie zum Download auswählen. Anschließend" + Chr(10)
            a$ + "muss die Updateprüfung erneut aufgerufen werden."
            MessageBoxH(0, a$, "Fehler!",#MB_OK)
            FileCheck()
          EndIf
        EndIf
      EndIf  
    Else
      MessageRequester("Updatecheck","Keine neue Version vorhanden!")
    EndIf
  Else
    MessageRequester("Fehler!","Version konnte nicht überprüft werden! Besteht Internetverbindung?")
  EndIf
EndProcedure

Procedure FileCheck() ;Überprüfen ob .chm, robocopy.exe, update.exe im stammverzeichnis vorhanden
  Restore FileCheck
  For k=0 To 2
    Read Datei$     ;zu überprüfende Datei
    Read DownURL$   ;DownloadURL
  
    If FileSize(StammVerzeichnis$+Datei$) = -1
      a$ = "Keine "+ Datei$ + " gefunden!" + Chr(10) + Chr(10)
      a$ + "Soll HandlCopy die " + Datei$ + " aus dem Internet herunterladen?" + Chr(10) + Chr(10)
      a$ + "Bestehende Internetverbindung erforderlich!"
      a=MessageBoxH(0, a$, "Dateiüberprüfung",#MB_YESNO)
      If a=6  ;6 = ja
        URLDownloadToFile_(0, DownURL$ + Datei$, StammVerzeichnis$+Datei$, 0, 0)
      EndIf
      If FileSize(StammVerzeichnis$+Datei$) = -1
        MessageRequester("Fehler!", "Download von "+Datei$+" fehlgeschlagen!")
      EndIf
    EndIf
  Next k
EndProcedure

;------------- Beginn MessageRequester zentrieren -------------
; Code aus CodeArchiverViewer 1.0
; German forum: http://robsite.de/php/pureboard/viewtopic.php?t=2958&highlight=
; Author: Andreas
; Date: 30. November 2003
; OS: Windows
; Demo: No

;Global mbHook.l,hThreadId.l
Procedure MsgBoxHookProc(uMsg,wParam,lParam)
  Protected Messagehandle.l
  Select uMsg
  Case #HCBT_ACTIVATE
    Messagehandle = GetDlgItem_(wParam,$FFFF)
    SetWindowLong_(Messagehandle,#GWL_STYLE,#WS_VISIBLE|#WS_CHILD|#SS_CENTER);Zentriert
    ;SetWindowLong_(Messagehandle,#GWL_STYLE,#WS_VISIBLE|#WS_CHILD|#SS_RIGHT);rechts
    UnhookWindowsHookEx_(mbHook)
  EndSelect
  ProcedureReturn 0
EndProcedure

Procedure MessageBoxH(parentWindow, title.s, message.s,flags)
  mbHook = SetWindowsHookEx_(#WH_CBT, @MsgBoxHookProc(), GetModuleHandle_(0), hThreadId)
  ProcedureReturn MessageBox_(parentWindow,title,message,flags)
EndProcedure

;Aufruf MessageRequester:
;MessageBoxH(0, "Text", "Titel",#MB_OKCANCEL)
;------------- Ende MessageRequester zentrieren -------------

Procedure BalloonTip(WindowID, Gadget, Text$ , Title$, Icon) 
  
  ToolTip=CreateWindowEx_(0,"ToolTips_Class32","",#WS_POPUP | #TTS_NOPREFIX | #TTS_BALLOON,0,0,0,0,WindowID,0,GetModuleHandle_(0),0) 
  SendMessage_(ToolTip,#TTM_SETTIPTEXTCOLOR,GetSysColor_(#COLOR_INFOTEXT),0) 
  SendMessage_(ToolTip,#TTM_SETTIPBKCOLOR,GetSysColor_(#COLOR_INFOBK),0) 
  SendMessage_(ToolTip,#TTM_SETMAXTIPWIDTH,0,380) 
  Balloon.TOOLINFO\cbSize=SizeOf(TOOLINFO) 
  Balloon\uFlags=#TTF_IDISHWND | #TTF_SUBCLASS 
  Balloon\hWnd=GadgetID(Gadget) 
  Balloon\uId=GadgetID(Gadget) 
  Balloon\lpszText=@Text$ 
  SendMessage_(ToolTip, #TTM_ADDTOOL, 0, Balloon) 
  If Title$ > "" 
    SendMessage_(ToolTip, #TTM_SETTITLE, Icon, @Title$) 
  EndIf 
  
EndProcedure 

DataSection
DefaultOptions:
  Data$ "0_PC-Verzeichnis", "c:\test", "1_USB-Verzeichnis", "c:\temp"
  Data$ "2_Copydirection (pc->usb od. usb->pc)", "pc->usb"
  Data$ "3_ntfs-rights (0->nein/1->ja)", "0"
  Data$ "4_AutoSave (0->nein/1->ja)", "1", "5_QuestEnd (0->nein/1->ja)", "0"
  Data$ "6_QuestStart (0->nein/1->ja)", "1"
  Data$ "7_RobocopyParameter", "/MIR /COPY:DAT /LOG:HandlCopy_log.txt"
  Data$ "8_TextPfad1", "PC-Festplattenordner auswählen:"
  Data$ "9_TextPfad2", "USB-Stick/Festplatten-Ordner auswählen:"
  Data$ "10_LogDatei (0->nein/1->ja)", "1"
  Data$ "ende","ende"
EndDataSection

DataSection
FileCheck:
  Data$ "HandlCopy.chm", "http://home.arcor.de/pb_zomtec/hc/"
  Data$ "robocopy.exe", "http://www.msu-hb.de/download/"
  Data$ "update.exe", "http://home.arcor.de/pb_zomtec/hc/"
EndDataSection
; IDE Options = PureBasic v3.94 (Windows - x86)
; CursorPosition = 462
; FirstLine = 432
; Folding = -----
; Executable = ..\MeineExecutes\HandlCopy\HandlCopy.exe
mfg
Zomtec
------------
noch PB 3.94
Antworten