- Offizieller Beitrag
Ich habe nahezu identisch zum Hilfebeispiel die Funktion _WinAPI_CopyFileEx verwendet.
In einer GUI werden Quelle und Ziel gewählt, die Progressbar ist in die Statusbar der GUI eingebettet.
Soweit ist das alles funktionsfähig (es werden Dateien 1 - 2 GB Größe kopiert).
Wenn jedoch die GUI den Fokus verliert, hängt sich die Anwendung auf.
Hier mal ein (so nicht lauffähiger) Ausschnitt des Skriptes mit den wesentlichen Inhalten für die Kopierfunktion:
AutoIt
Global $hProgressProc = DllCallbackRegister('_ProgressProc', 'bool', 'uint64;uint64;uint64;uint64;dword;dword;handle;handle;ptr')
Global $INI = _ScriptNameINI(False)
If Not FileExists($INI) Then Exit MsgBox(16, 'FEHLER', 'Die Datei ' & @CRLF & '"' & $INI & '"' & @CRLF & 'ist nicht im Programmordner!')
Global $sourcePC = IniRead($INI, 'copy', 'source_pc', '\\Server\GDILine\Factur')
Global $targetUSB = StringLeft(@ScriptDir, 3)
Global $sourceUSB = $targetUSB
Global $targetVM = IniRead($INI, 'copy', 'target_vmshare', 'C:\VM_Share')
Global $sTitle = 'GDI.GDB - CopyTool'
Global $hGui = GUICreate($sTitle, 600, 175)
GUISetBkColor(0xFFFFFF)
Global $tGroup = _GuiCtrlGroup_Create($hGui, 'Kopieren Datenbank Datei', 15, 15, 570, 125, 0x000080, 0x33A644, -1, BitOR($_GROUPTEXT_RIGHT, $_GROUPTEXT_ITALIC))
GUICtrlCreateLabel('Bitte den Kopiervorgang auswählen!', 25, 30)
Global $rPC2USB = GUICtrlCreateRadio(' Kopiere vom PC auf USB-Stick', 25, 50)
GUICtrlSetState(-1, $GUI_CHECKED)
Global $rUSB2Share = GUICtrlCreateRadio(' Kopiere vom USB-Stick auf Share des Virtual-PC', 25, 75)
Global $btRun = GUICtrlCreateButton('Starte Kopiervorgang', 390, 70, 185, 25)
Global $lbComplete = GUICtrlCreateLabel('', 25, 105, 550, 20) ; ERFOLG
GUICtrlSetColor(-1, 0x0000FF)
Global $hStatus = _GUICtrlStatusBar_Create ($hGUI)
_GUICtrlStatusBar_SetMinHeight($hStatus, 20)
Global $idProgress = GUICtrlCreateProgress(0, 0, -1, -1, $PBS_SMOOTH)
GUICtrlSetColor(-1, 0x008B00) ; grün
_GUICtrlStatusBar_EmbedControl($hStatus, 0, GUICtrlGetHandle($idProgress))
GUISetState(@SW_SHOW)
Global $tFile, $source, $target
While True
Switch GUIGetMsg()
Case -3
Exit
Case $btRun
If BitAND(GUICtrlRead($rPC2USB), $GUI_CHECKED) Then
$source = $sourcePC
$target = $targetUSB
Else
$source = $sourceUSB
$target = $targetVM
EndIf
$tFile = _GDInewestFile($source) ; die neueste Datei im Quellordner suchen
If @error Then
MsgBox(16, 'FEHLER', $tFile)
Else
GUICtrlSetState($btRun, $GUI_DISABLE)
GUICtrlSetData($lbComplete, 'Kopiere: GDI.GDB vom "' & $tFile.Date & '"')
_Copy_w_Progress($tFile.Path & $tFile.File, StringRegExpReplace($target, '(\\)*$', '') & '\' & $tFile.File)
EndIf
EndSwitch
WEnd
Func _Copy_w_Progress($_source, $_destination)
If Not _WinAPI_CopyFileEx($_source, $_destination, 0, DllCallbackGetPtr($hProgressProc)) Then
_WinAPI_ShowLastError('Beim Kopieren der Datei "' & $_source & '" ist ein Fehler aufgetreten.')
_ProgressSetData()
WinSetTitle($hGUI, '', $sTitle)
GUICtrlSetData($lbComplete, '')
GUICtrlSetState($btRun, $GUI_ENABLE)
EndIf
EndFunc
Func _ProgressProc($iTotalFileSize, $iTotalBytesTransferred, $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData)
#forceref $iStreamSize, $iStreamBytesTransferred, $iStreamNumber, $iCallbackReason, $hSourceFile, $hDestinationFile, $pData
Local $iPercent = Round($iTotalBytesTransferred / $iTotalFileSize * 100)
_ProgressSetData($iPercent, $iTotalBytesTransferred, $iTotalFileSize, $lbComplete)
Sleep(10)
Return $PROGRESS_CONTINUE
EndFunc
Func _ProgressSetData($_i=-1, $_BytesTrans=0, $_BytesTotal=0, $_idMsg=Null)
GUICtrlSetData($idProgress, ($_i = -1 ? 0 : $_i))
Local $sPercent
Switch $_i
Case 100
$sPercent = ' [ Vollständig ]'
If $_idMsg <> Null Then GUICtrlSetData($_idMsg, 'Kopiervorgang abgeschlossen.')
AdlibRegister('_ResetProgess', 750)
Case -1
$sPercent = ''
Case Else
$sPercent = StringFormat(' [ %s von %s - %d %% ]', _FormatByte($_BytesTrans, '', False, 1), _FormatByte($_BytesTotal, '', False, 1), $_i)
EndSwitch
WinSetTitle($hGUI, '', StringFormat('%s%s', $sTitle, $sPercent) )
EndFunc
Func _ResetProgess()
AdlibUnRegister('_ResetProgess')
_ProgressSetData()
GUICtrlSetState($btRun, $GUI_ENABLE)
EndFunc
Func _Exit()
DllCallbackFree($hProgressProc)
EndFunc
; ...
; folgend: Funktionen für INI-Name, Ermittlung neueste Datei, Formatierung Byte
Alles anzeigen
Ich kann mir keinen Zusammenhang zwischen aktiver GUI und Funktionsfähigkeit der Kopierfunktion herleiten.
Hat jemand eine Idee?