AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Explorer mehrere Dateien öffnen
Thema durchsuchen
Ansicht
Themen-Optionen

Explorer mehrere Dateien öffnen

Ein Thema von mumu · begonnen am 14. Okt 2005 · letzter Beitrag vom 22. Okt 2005
Antwort Antwort
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#1

Explorer mehrere Dateien öffnen

  Alt 14. Okt 2005, 15:17
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#2

Re: Explorer mehrere Dateien öffnen

  Alt 14. Okt 2005, 15:23
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#3

Re: Explorer mehrere Dateien öffnen

  Alt 14. Okt 2005, 16:08
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???
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#4

Re: Explorer mehrere Dateien öffnen

  Alt 14. Okt 2005, 16:35
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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Explorer mehrere Dateien öffnen

  Alt 14. Okt 2005, 16:53
Eventuell ist ja MSDN-Library durchsuchenWaitForInputIdle das, was du sichst:
Zitat:
The WaitForInputIdle function waits until the specified process is waiting for user input with no input pending, or until the time-out interval has elapsed.
Musst du mal gucken, ob es dir hilft.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#6

Re: Explorer mehrere Dateien öffnen

  Alt 21. Okt 2005, 13:48
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.051 Beiträge
 
Delphi 12 Athens
 
#7

Re: Explorer mehrere Dateien öffnen

  Alt 21. Okt 2005, 14:00
Eventuell wird irgrendwas in deiner DLL nicht richtig beendet und somit wird dann auch nicht die Kontrolle an den Explorer zurückgergeben

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#8

Re: Explorer mehrere Dateien öffnen

  Alt 22. Okt 2005, 09:44
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
  Mit Zitat antworten Zitat
mumu

Registriert seit: 28. Okt 2003
Ort: Bamberg
519 Beiträge
 
#9

Re: Explorer mehrere Dateien öffnen

  Alt 22. Okt 2005, 10:46
ich habs !!!

das problem war, dass ich sendmessage aufgerufen hab. das wartet bis die gesendete Message verarbeitet wurde. da ich aber in meiner Procedure
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; 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.

hab das jetzt folgendermaßen gelöst:
DP-Rulezzz !

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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz