![]() |
Re: Pegasus: Luckies persönliches Synchronisationstool
Hallo Luckie,
ich habe mal die MD5-Unit von Assarbad gegen die von Matthias Fichtner ( ![]() Aber auch mit dieser Unit bleibt dein Programm "hängen". Bei mir besonders bei Word-Dokumenten (*.doc). Also denke ich, hat es mit der Erstellung der MD5-Hashes anscheinend nichts zu tun, das Dein Programm "stehen bleibt". |
Re: Pegasus: Luckies persönliches Synchronisationstool
Duhu Luckie,
hab mir och ma deinen Pegasus angeguckt und irgendwie läuft da was nich so, wie soll bestimmt soll. :shock: Isch kann of die Verzeichnisbuttons rumklicken wie isch will, aber nüschts passiert. :cry: Nagut, also hab'sch ma selber kompiliert, nachgeguckt und siehe da ... CoInitialize(nil) liefet S_FALSE und wenn es dat macht, machst du überhauptnüschts ... nichma 'ne Fehlermeldung hast'e für mich. *eingeschnapptsei* So läuft es ^^
Delphi-Quellcode:
var
CoInit: Boolean; begin Result := false; CoInit := CoInitialize(nil) = S_OK; try ... finally if CoInit then CoUninitialize; end; Hier ma ä leicht verständliches Beispiel:
Delphi-Quellcode:
Man kann nur einmal initialisieren (jedenfalls bei mir > D7 + WinXP SP2).
program Project1;
uses Windows, SysUtils, ActiveX; var CoInit1, CoInit2: Boolean; begin CoInit1 := CoInitialize(nil) = S_OK; try CoInit2 := CoInitialize(nil) = S_OK; try MessageBox(0, PChar('CoInit1=' + BoolToStr(CoInit1, True) + ', CoInit2=' + BoolToStr(CoInit2, True)), '', 0); finally if CoInit2 then CoUninitialize; end; finally if CoInit1 then CoUninitialize; end; end. Und da es über TApplication.Initialize schonmal aufgerufen wurde ...
Delphi-Quellcode:
InitProc zeigt auf InitComObj, wo entweder CoInitializeEx oder CoInitialize ofjerufen wird.
procedure TApplication.Initialize;
begin if InitProc <> nil then TProcedure(InitProc); end; Mann ohh mann, da such man sich dumm und dusslig und dann isses da, wo man hätte als erstes nachsehen können/sollen. :wall:
Code:
//ComObj.pas ... die von D7
initialization ... if not IsLibrary then begin SaveInitProc := InitProc; [color=clRed]InitProc := @InitComObj;[/color] end; Und dat hier... Zitat:
Delphi-Quellcode:
procedure TForm1.ListView1DblClick(Sender: TObject);
var s: String; begin s := ListView1.Items[Listview1.ItemIndex].Caption; ShellExecute(Handle, 'open', PChar(s), nil, nil, SW_SHOWNORMAL); end; |
Re: Pegasus: Luckies persönliches Synchronisationstool
Werde ich mal einpflegen in meiner Version. Danke für deine Mühe.
|
Re: Pegasus: Luckies persönliches Synchronisationstool
Ach ja, hätt ich beinah vergessen ...
du löschst doch alle leeren Ordner? Na ja, es is zwar nich so schlimm, aber manchma lege ich 'nen Ordner schon an, bevor ich diesen (Tage/Wochen später) mal nutze (befülle). Tja, diese Ordner würden dann ja von dir gelöscht. OK, ich könnte den/die dann zwar irgendwann mal wieder neu anlegen (z.B. erst wenn er wirklich benötigt wird). Eventuell wäre da ein Test ob ein Ordner im Quellverzeichnis vorhanden ist besser, als "nur" nachzusehn ob was in dem Ordner drin ist. |
Re: Pegasus: Luckies persönliches Synchronisationstool
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
Re: Pegasus: Luckies persönliches Synchronisationstool
Zu meiner Schand emuss ich gestehen, dass ich noch nicht dazu gekommen bin etwas an dem Programm zu machen. :oops:
|
Re: Pegasus: Luckies persönliches Synchronisationstool
och, hat ja Zeit ... hab für mich ja auch erstmal nur'n paar Workarounds eingebaut, dammit es ohne Abzustürzen läuft :)
ich war ja mehr üb das VCL von dir überrascht ;) |
Re: Pegasus: Luckies persönliches Synchronisationstool
Moin Luckie ^^
erstmal hab ich ein Problem festgestellt, kann aber einfach nicht sagen woher es kommt o.O und zwar, wenn ich meinen USB-Sick mit einem Verzeichnis auf der Platte synchronisiere, dann läuft erstmal das Erstellen der Dateilist normal ab, auch das Syncronisieren läuft ohne (scheinbar) Probleme durch, nur wenn dich danach nochmal eine Dateiliste erstelle werden plötzlich wieder Unterschiede gefunden, obwohl doch nach dem Syncronisieren keine mehr vorhanden sein sollten. :gruebel: Es gab auch keine Fehlermeldung, daß bestimmte Dateien nicht kopiert werden konnten, oder dergleichen. Auch weiß ich nicht, oder die Dateien beim ersten Durchgang schon in der Dateiliste enthalten waren, oder ob sie schon dort übersehen wurden. Ist bisher auch nur 2-mal aufgefallen und beim ersten Mal war's erst nach dem 3. Durchlauf alles synchron. Beim 2. Mal hatte ich wenigstens mit 'nem eigenem (alten) Programm nochmal verglichen und die Unterschiede waren (nach dem 1. Durchlauf) wirklich noch da. Konnte dieses aber im Debugger bisher noch nicht reproduzieren -.-'' Ach ja: 1 GB USB-Stick im Durchschnit 500-900 MB mit 17.000-18.000 Dateien Dann reagiert dein Programm manchmal nicht mehr ... vorwiegend, wenn man auf Abbrechen geklickt hatte und dann eine Weile was anderes machte (also der Pegasus im Hintergrund lag), danach war dann die ganze Form komplett Weiß und er konnte nur noch über den taskmanager beendet werden. (wobei dieses auch an meinem Windows liegen könnte ... ist ja etwas lediert, wie man an meinem Problemchen mit EM_SETCUEBANNER sieht -.-'' ) Nun noch ein kleiner Tipp bezüglich der Windows-Cache: Du ließt die Dateien ja rückwärts ein, demnach würde ich FILE_FLAG_RANDOM_ACCESS bei CreateFile empfehlen. Und ich weiß ja nicht wieviel du am Pegasus noch ändern willst, aber bei meiner Dateianzahl rechnet der schon echt lange beim Filtern/Anzeigen der Dateiliste (nach dem Suchen/Hashen der Dateien), vorallem wenn sich mal viel verändert hatte. Ich denk mal ein Großteil dieser Zeit (anzeigen / ListBox füllen) könnte man verhindern, indem die Dateiinfos nich noch ein zweites Mal ausgelesen werden würden. (eventuell gleich bei der Dateisuche mit speichern? ... [size=2]GetFileSize und FileAge ruft ja für jede Datei einzeln nochmals FindFirstFile auf ... GetFileSize ruft FileExists, welches nochmals FileAge aufruft, womit dann pro Datei 3-mal FindFirstFile + die paar mal bei der Dateisuche aufgerufen wird ... dauert halt etwas, wenn die WindowsCache sich dann jedesmal nochmals auf dem langsamen USB-Stick vergewissert, daß sie noch aktuell ist[/size]) Zumindest ein FileExists/FileAge/FindFirstFile kann man leicht einsparren :mrgreen;
Code:
////////////////////////////////////////////////////////////////////////////////
// Procedure : GetFileSize // Comment : Returns the filesize function GetFileSize(szFile: PChar): Int64; var fFile : THandle; wfd : TWIN32FINDDATA; begin result := 0; [color=darkred][s]if not FileExists(szFile) then exit;[/s][/color] fFile := FindFirstfile(pchar(szFile), wfd); if fFile = INVALID_HANDLE_VALUE then exit; [color=red]if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY = 0 then[/color] result := ([color=blue]Int64(wfd.nFileSizeHigh) shl 32[/color]) or wfd.nFileSizeLow; windows.FindClose(fFile); end; |
Re: Pegasus: Luckies persönliches Synchronisationstool
sieht super aus dein programm.
ist es auch netzwerktauglich? |
Re: Pegasus: Luckies persönliches Synchronisationstool
theoretisch ja. (und praktisch vermutlich auch)
Du mußt nur die Ordner so angeben, wenn du es im Explorer machen würdest. Nur in wieweit es bei geschützten Verzeichnissen geht müßte man testen. Es geht halt nahezu alles was ![]() [add2] ![]() [add] PS: der Fehler von nkaaa in #44 is och noch drin ... liegt wohl an der fehlenden Synchronisierung :angel2: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz