![]() |
Explorer mehrere Dateien öffnen
Ich habe ein Programm geschrieben, das aus dem Kontextmenü vom Explorer heraus aufgerufen wird. Immer wenn ich jetzt mehrere Dateien im Explorer selektiere, dann würde normalerweise mein programm für jede einzelne datei extra geöffnet werden.
Deshalb verwende ich die Komponente TOneInstance (kennen bestimmt einige von euch), um die Aufrufparameter von den weiteren Instanzen an die erste Instanz meines Programms zu übergeben. Anschließend schließen sich die anderen Instanzen und es ist nur noch die erste Instanz verfügbar, die alle Dateipfade zugeschickt bekommen hat. Mein Problem ist jetzt jedoch: Ich muss sofort nachdem alle Dateien an die erste Instanz geschickt wurden eine Procedure ausführen, die die Dateien bearbeitet. Jedoch weiß ich natürlich nicht, wie lange es dauert, bis der Explorer alle Parameter aller Instanzen an der ersten Instanz angekommen sind. Bisher habe ich das über nen Timer gelöst. 250 ms Intervall. Jedesmal wenn jetzt noch eine Datei ankommt an der ersten instanz, dann wird der timer neugestartet. Solange bis alle verarbeitet wurden. Jetzt kann es aber vorkommen, dass es aufgrund der PC auslastung zu verzögerungen kommt und mein timer abläuft, bevor ich alle dateipfade erhalten habe. hat jemand ne idee wie ich das ganze sonst angehen kann? Vielen Dank schonmal |
Re: Explorer mehrere Dateien öffnen
Irgendwie kann man sein Programm ja auch anders aufrufen lassen?
Irgendwas mit DDE und so. Dabei werden die dateien doch anders übergeben ... eventuell ja auch alles zusammen, als ein Packet? |
Re: Explorer mehrere Dateien öffnen
danke himitus!
eigentlich ne klasse idee. die parameter übergabe funktioniert ohne probleme mit dem DDE Server. jedoch erhalte ich auch alle parameter hintereinander. und leider weiß ich auch hier nicht, wann der letze parameter an mein programm übergeben wurde. jemand noch ne idee??? |
Re: Explorer mehrere Dateien öffnen
Na dann eben nicht ... dachte da wird es eventuell in 'ner Art StringList übergeben -.-''
Notfalls kannst du ja auch den Timer anpassen. z.B. wenn schon 10 Dateien übergeben wurden, dann 1 Sekunde Intervall, nach 100 Dateien 5 Sekunden ... oder so in der Art? |
Re: Explorer mehrere Dateien öffnen
Eventuell ist ja
![]() Zitat:
|
Re: Explorer mehrere Dateien öffnen
also ich habe jetzt rausgefunden, das die einzigste möglichkeit ist, soetwas zu realisieren: Shell Extension
dabei handelt es sich um eine dll, die man ins kontextmenü einbindet und bei der man alle ausgewählten dateien auf einmal auslesen kann. dann muss man die nur noch seinem programm zukommen lassen. wie mach ich das denn am besten? ich muss nämlich aus der DLL heraus mein programm starten und diesem dann die dateien übergeben. das problem dabei ist, dass ich zwar das Programm mit CreateProcess starten kann und dann mit WaitForInputIdle darauf warte, dass es bereit ist und sein formular geladen hat. anschließend sende ich dann die selektierten dateien per SendMessage an das Programm und sobald alle dateien gesendet wurden, sende ich ein steuerzeichen (sozusagen ein Terminierungszeichen, das angibt, dass alle dateien geschickt wurden). somit weiß das programm, dass es mit der bearbeitung beginnen kann. mein großes problem ist jetzt jedoch, dass nach dem Starten des Programms mit CreateProcess (aus der DLL heraus) der Explorer nicht mehr ansprechbar ist, bis das programm beendet wird. keine ahnung wieso?!? ich hätte es schon mit ShellExecute probiert, wenn ich dann an das ProzessHandle kommen würde und anschließend darüber das Formular finde an dem ich mit SendMessage die Nachricht schicken kann? kann mir jemand sagen, warum das so ist? bzw. was ich machen kann? danke schonmal |
Re: Explorer mehrere Dateien öffnen
Eventuell wird irgrendwas in deiner DLL nicht richtig beendet und somit wird dann auch nicht die Kontrolle an den Explorer zurückgergeben :gruebel:
Und gibt ShellExecute nicht, wenn es erfolgreich ausgeführt wurde, ein Handle auf irgendwas vom aufgerufenen Programm zurück? Ach ja, warum übergibst du eigentlich alles einzeln? Wäre es nicht auch ganz einfach alle Dateien in 'ner Art StringList zu übergeben? (also alles auf einmal ... schwups drüben isses) z.B. wie in der Registry ... dort werden die Einzelstrings durch #0 voneinander getrennt und die ganze Liste wird mit #0#0 abgerschlossen. |
Re: Explorer mehrere Dateien öffnen
also egal, ob ich createprocess oder shellexecute verwende --> das selbe ergebnis der explorer hängt, so lange mein programm ausgeführt wird.
wenn der folgende code eingefügt wird, dann hängt der explorer, falls ich ihn rausnehm, dann hängt er nicht. er wird ausgeführt sobald der user im kontextmenü meinen eintrag anklickt
Delphi-Quellcode:
window_handle := RunProcess(currentdir + 'Programm.exe');
if window_handle <> 0 then begin for i:=0 to files.Count-1 do begin GetMem(SendRecord, sizeof(TSendRecord)); try send_string := files[i]; if i = files.Count-1 then SendRecord.last_message := true else SendRecord.last_message := false; SendRecord.pfad := send_string; aCopyData.dwData := 0; aCopyData.cbData := sizeof(TSendRecord); aCopyData.lpData := SendRecord; SendMessage(window_handle, WM_COPYDATA, 0, Longint(@aCopyData)); finally FreeMem(SendRecord, sizeof(TSendRecord)); end; end; end; alles in einem schwups übergeben mach ich deshalb nicht, weil wenn der user z.b. 100 dateien selektiert, dann glaub ich irgendwie nicht, dass ich das alles als einen parameter an das programm übergeben kann. das macht wahrscheinlich windows nicht mit |
Re: Explorer mehrere Dateien öffnen
ich habs !!! ;-)
das problem war, dass ich sendmessage aufgerufen hab. das wartet bis die gesendete Message verarbeitet wurde. da ich aber in meiner Procedure
Delphi-Quellcode:
eine längere Verabeitung starte, wartet die dll bis sie die bestätigung des erhalts der message vom programm erhält. da das schonmal 5 minuten dauert, bis die verarbeitung fertig ist und die bestätigung geschickt wurde, ist in dieser zeit der explorer blockiert.
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA;
hab das jetzt folgendermaßen gelöst: ![]() ruf also in meiner procedure WM_COPYDATA nicht gleich die Verarbeitung auf, sondern erst über eine Message an mein eigenes Programm, natürlich mittels PostMessage. dadurch wird sofort zurückgekehrt und nicht auf die verarbeitung gewartet danke an alle für die hilfe |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:00 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