![]() |
Parameter SCHNELL an Hauptprog weiterleiten
Hallo Community,
ich habe mir einen player geschrieben, der aufgerufene mp3s per sendmessage und wm_copydata empfängt. danach schließen sich die weiteren programme, welche dadurch geöffnet wurden durch zB "halt" oder "application.terminate", sodass schließlich nur wieder mein hauptprogramm läuft. komme ich nun zu meinem problem: wenn ich viele mp3s im explorer markiere und diese hinzufügen möchte, fragt mich windows erst einmal, ob ich diesen vorgang ausführen möchte, da er möglicherweise zu einer hohen auslastung führen könnte (hab ja zB mind. 40 dateien gleichzeitig geöffnet). drücke dann immer auf ok und meinem player werden die dateien hinzugefügt. allerdings brauch dieser vorgang relativ lange (was bei zB winamp nicht der fall ist, wenn man viele dateien gleichzeitig hinzufügen möchte). durch das ständige öffnen, senden und schließen pro parameterübergabe ändert sich auch ständig der cursor (pfeil, sanduhr, pfeil usw.) bis alle dateien hinzugefügt wurden. kann ich diesen prozess beschleunigen? cya |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Moin Nogge,
an welcher Stelle prüfst Du denn, ob schon eine Instanz Deines Programmes läuft? |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Schau dir mal die Komponenten TDDeSeverConv und TDDeServerItem an, damit geht das sehr schön und ohne ein Programm aufzurufen!
![]() |
Re: Parameter SCHNELL an Hauptprog weiterleiten
DDE wäre dafür die schlechteste Idee.
Zum einen ist es eine veraltete Technik, die man (ich) auch nur noch aus Kompatibilitätsgründen zu anderen Programmen benötigt. DDE gibt es unter .NET schon gar nicht mehr. Zudem wird der Nachrichten Austausch in DDE durch TEXT STRINGS !! realisiert. Mit Schnelligkeit hat das nix zu tun .. Guck Dir da eher mal die Socketkomponenten an, wenn Du Daten austauschen möchtest. TCP/IP |
Re: Parameter SCHNELL an Hauptprog weiterleiten
das ganze dauert soo lange weil du vermutlich erst im OnCreate des Haupformulars prüfst ob dein Programm schon offen ist. Wenn du das ganze schon in der Projektdatei prüfst bevor irgend eine Instanz eines Forms erzeugt wurde geht das ganze wesentlich schneller (und so machts winamp auch, da werden nicht erst alle module geladen wenn am ende das prog doch abgeschossen wird). Also einfach bevor irgendwas in der Projectdatei ausgeführt wird prüfen ob das prog schon läuft und dann gleich von der stelle aus die parameter weiterreichen
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
@stoxx ich weiß nicht, ob wir gerade aneinander vorbeireden...TCP/IP hat mit meinem problem glaube ich mal nichts zu tun. ich möchte ja nichts über ein netzwerk austauschen, sondern lediglich meine mp3s in meine playlist hinzufügen. wenn es trotzdem damit gehen soll, kannste ja vllt mal ein beispiel-sourcecode oder einen link posten.
ich prüfe bereits in der projektdatei, ob mein hauptprogramm läuft und gebe dort auch die parameter weiter, d.h. NICHT in OnCreate ;-) die form wird bei einer parameterübergabe gar nicht erst erstellt. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Moin Nogge,
dann ist es wohl ganz sinnvoll mal den Abschnitt zu posten. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
hi Nogge,
kann dem stoxx da nur zustimmen. Habe mit DDE nur die Erfahrungen "langsam & unzuverlässig" gemacht. TCP/IP kannst du sehr wohl auch ohne Netzwerk nutzen. Damit kannst mit Sockets wunderbar Daten zwischen Programmen auf 1 Rechner austauschen. Mußt aber dran denken, daß TCP/IP überhaupt installiert ist, was hier und da mal net sein muß. :???: Roderich |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Hi Nogge,
TCP/IP geht natürlich, wie Roderich sagte, auch auf ein und demselben Rechner. Es gibt aber auch noch eine dritte Möglichkeit, über MMF .. Man nimmt dazu ein von zwei Programmen gleichzeitig genutzten Speicherbereich. Ein Beispiel dafür, hatte ich schonmal vor langer Zeit hier ins Board gestellt .. siehe hier. ( 6 letzter Beitrag von unten) ![]() viele Grüße stoxx |
Re: Parameter SCHNELL an Hauptprog weiterleiten
da C.Seehase meinen sourcecode mal sehen wollte, hier:
Delphi-Quellcode:
var MainApp:HWND; MyCopyDataStruct:TCopyDataStruct;
begin if FindWindow(nil,Main_ID)<>0 then begin MainApp:=FindWindow(nil,Main_ID); if ParamCount>0 then begin with MyCopyDataStruct do begin dwData:=MY_SENTPARAM; cbData:=Length(PChar(ParamStr(1)))+1; lpData:=PChar(ParamStr(1)); end; end else begin with MyCopyDataStruct do begin dwData:=MY_SHOWAPP; cbData:=0; lpData:=nil; end; end; SendMessage(MainApp,WM_COPYDATA,0,Longint(@MyCopyDataStruct)); //Application.Terminate; end else begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Ich bin mir da nicht hundertpro sicher, aber ich bezweifle, dass der Explorer, wenn mehrere Dateien markiert sind, nicht die Möglichkeit besitzt, diese nicht einzeln sondern als "Paket" an ein Programm zu übergeben, sprich so eine Art "Filelist" zu übergeben.
Solltest Dich mal in der MSDN umschauen. Bei 100 einzelnen Files wäre das in der Tat immer extrem langsam. Wie macht das WinAmp oder der Realplayer bzw. der Mediaplayer? Dort gibts doch den Eintrag im Explorer "Zur Wiedergabeliste hinzufügen". Welche Werte werden hier in der Registry gesetzt? |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Zitat:
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
Hi!
Bei Winamp steht in beiden Fällen nur ein %1 dahinter. Allerdings wird beim hinzufügen zur Liste noch ein anderer Parameter übergeben (aber kein Platzhalter sondern /ADD) Ciao Frederic |
Re: Parameter SCHNELL an Hauptprog weiterleiten
ich war mal auf der MSDN seite, aber das ist mir alles viel zu unübersichtlich. ich habe keine ahnung, unter welcher kategorie ich dort suchen muss ;_;
kann mir hier niemand z.B. nen beispiel sourcecode posten oder einen direkten link geben? wenn das mit solch einem paket wirklich geht, dann wäre das wohl DIE lösung, nur wie soll das funktionieren?^^ btw. bitte postet keine neuen fragen, sondern eröffnet selber nen thread. Erklärungen für ParamStr(0) bzw. ParamStr(1) sowie ParamCount findet ihr alle in Delphi-Praxis-Forum. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
sorry Nogge, hab wahrscheinlich Deine Frage zu ungenau gelesen, dachte es ging um DDE oder Datenübertragung, Du willst ja mit dem Explorer kommunizieren .. :coder2:
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
Mal eine andere Frage: Werden die dateien nur in einer Liste hinzugef+gt oder machst du noch was anderes mit denen (ID3 Tags auslesen, ...)?
Ansonsten probier mal: oneinst von Nico ![]() |
Re: Parameter SCHNELL an Hauptprog weiterleiten
hab mir das project mal angesehen, jedoch funktioniert die exe nicht so, wie ich möchte (s. erläuterung) und zweitens verstehe ich die .pas nicht so wirklich...
erläuterung: als ich z.B. 40 mp3s markiert hatte und diese mit der project1.exe von OneInst öffnen wollte, wurde nur EINE mp3 hinzugefügt...ich möchte ja alle markierten dateinamen in meine liste habe und das schneller, als bisher (z.B. wie bei winamp). vllt kann man ja mehrere dateinamen mit dieser variante (OneInst) hinzufügen, nur fehlt mir dafür das nötige wissen ;_; um deine frage zu beantworten: ja, ich möchte natürlich auch id3 tags usw. auslesen. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
So wie ich dich verstanden habe zu du jetzt die MP3 Dateien auf eine Exe? Wenn ja, wird für jede Datei ne neue Instanz gestartet. Dein Programm würde also 40 mal gestartet dann jeweils eine Nachricht abgeschickt. Das dauert natürlich. Winamp löst es doch anders, wenn ich mich Recht erinnere. Dort werden die Dateien doch direkt auf das Fenster der Anwendung gezogen, oder?
DragAcceptFiles sollte deine Lösung sein. Dann können die Dateien auch direkt in die Anwendung gezogen werden. Also Beispiel habe ich das hier gefunden: ![]() Ob es funktioniert, keine Ahnung. Aber der Ansatz sollte hoffentlich klar werden. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
jim_raynor, du verstehst mich ;-) du hast exakt mein problem beschrieben. es dauert mir einfach zu lange bis meine wie im beispiel 40 instanzen geöffnet und wieder geschlossen werden. der ansatz ist klar und wirklich gut, nur weiß ich nicht, wie ich das umsetzen kann. bei windows macht das die maus ja ganz simpel, ohne man das selbst etwas machen muss (außer "procedure DragAcceptFiles( var msg : TMessage ); message WM_DROPFILES;"). das empfangen ist einfach mit dieser procedure, nur muss ich jetzt ja irgendwie senden können (was die maus automatisch macht).
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
Das mit DragAccecptFiles musst du in deine laufende Anwendung einbauen. Ein Extra-Programm brauchst du nicht mehr. In der Prozedur in der die WM_DROPFILES Messages (in dem Beispiel AcceptFiles) abgefangen wird, wird dann einfach, statt der Ausgabe mit MessageBox die Dateien deiner Liste hinzugefügt.
Du darfst also nicht mehr die Dateien auf die Exe ziehen, sondern musst diese direkt auf das Formular der Anwendung ziehen. Wie man das Drag'n'Drop auf die Exe beschleunigen kann, weiss ich leider nicht. Auch hat dieses DragAcceptFiles nichts damit zu tuen. Aber zumindestens kannst du dann die Dateien in die laufende Anwendung ziehen. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
ich will doch gar nicht die dateien auf mein fomular ZIEHEN, sondern per RECHTSKLICK: (z.B. mit dem eintrag) "add to player" in meine liste hinzufügen.
Zitat:
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
poste mal die funktion die aufgerufen wird, wenn der parameter wm_copydata message in deinem Programm ankommt. ggfs liest du hier schon mp3 tag usw... aus, dann kann es nämlich sein, dass es deswegen so lange dauert, bis alle dateien in deinem player erscheinen.
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
drück ich mich sooo undeutlich aus? jeder, der mein problem nicht versteht, sollte mal selber schnell ne COPYDATA procedure bzw. programm erstellen und mehrere dateien gleichzeitig öffnen. dabei werden dann so viele instanzen meines programms geöffnet und wieder geschlossen wie ich an dateien so geöffnet habe. selbst wenn ich meine parameter vor dem erstellen der form an die hauptinstanz sende und die instanz gleich wieder schließe, dauert es sehr lange, bis alle instanzen geschlossen werden. bei 2 oder 3 dateien bemerkt man die verzögerung auch nicht, aber bei 30,40,50,100 usw. dateien gleichzeitig dauert es eine ganze weile.
@jim_raynor noch mal: ich habe schon lange ne procedure für "drag&drop vom explorer in meine playlist" in meinem programm integriert. möchte jetzt aber noch (wie ich dauernd erwähne) eine andere möglichkeit bzw. ne schnellere möglichkeit sehr viele dateinamenpfade in eine liste zu senden. vllt versteh ich dich jetzt ja nur falsch... |
Re: Parameter SCHNELL an Hauptprog weiterleiten
es hat zwar nichts damit zu tun, aber ok...hier mein source code fürs empfangen (so wird diese Thread wenigstens in der übersicht wieder nach oben geschoben^^):
Delphi-Quellcode:
ist mein problem wirklich so schwer zu lösen oder möchte mir hier einfach niemand ne lösung schreiben?^^
procedure TForm1.WMCopyData(var Msg: TWMCopyData);
var sText: Array of Char; Item: String; ForegroundThreadID,ThisThreadID:Cardinal; begin case Msg.CopyDataStruct.dwData of MY_SENTPARAM: begin SetLength(sText,Msg.CopyDataStruct.cbData); StrLCopy(PChar(sText),Msg.CopyDataStruct.lpData,Msg.CopyDataStruct.cbData); Item:=PChar(sText); Listbox1.Items.Add(Item); MY_SHOWAPP: begin ForegroundThreadID:=GetWindowThreadProcessID(GetForegroundWindow); ThisThreadID:=GetWindowThreadProcessId(Handle); if AttachThreadInput(ThisThreadID,ForegroundThreadID,True) then begin BringWindowToTop(Handle); SetForegroundWindow(Handle); AttachThreadInput(ThisThreadID,ForegroundThreadID,False); end; end; end; |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Ich habs jetzt nochmal getestet. Also mehrere Dateien markiert und auf eine Exe gezogen. Hat wunderbar nur das prog nur einmal gestartet.
Wenn ich die Dateien markiere und über das Kontextmenü dann an Winamp schicke wird auch bei Winamp für jede Datei eine Anwendung geöffnet. Ich glaube einfach, dafür gibt es keine Lösung. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Muss es aber doch!
Die "profi"-Player können das ja auch! Wenn ich mehrere mp3-Dateien im Windows-Explorer markiert habe und ENTER drücke sind die sofort in der Playliste! Kann es vielleicht sein, dass Windows beim öffnen einer Datei eine Message rausschickt(zb: wm_beforeopen(filename)), die Winamp abfängt, prüft ob die Datei mit Winamp abgespielt werden soll und den "Windows-öffnen-Vorgang" abbricht??? Würde die Geschwindigkeit erklären. DaDu |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Okay, hast Recht. Was ich jetzt rausgefunden, wenn du in den Dialog zum Bearbeiten der Dateitypen offen hast, kannst du eine Option DDE aktivieren benutzen. Dann funktioniert das allerdings. Allerdings frag mich nicht wie das Programm aussehen muss, damit es soetwas unterstützt. Das ne Windows-message gesendet wird bezweifel ich stark, da er ja garnicht weiss an welches Prog und wenn doch könnte man so schöne Viren und Trojaner basteln ;)
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
also ist es mit dem wissen der Community aus Delphi-Praxis nicht möglich, meinen willen zu realisieren? verstehe deine sätze nicht immer so genau, da du sie nicht wirklich komplett ausschreibst, jim_raynor^^ genauere tipps bzw. irgendwelche kleinen hilfen kann mir niemand geben? ;_;
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
Versuchen wir es noch mal auf Deutsch und etwas umfangreicher. :oops:
Im Explorer unter Extras->Ordneroptionen bekommst du ja eine Übersicht mit den Dateitypen. Wenn du dann deinen entsprechenden Dateityp auswählst und dann auf erweitert gehst, kannst du ja die Aktionen bearbeiten, die zu diesem Dateitypen im Kontextmenü angezeigt werden. Wenn du dann eine Aktion bearbeitest, kannst du die Option "DDE verwenden" aktivieren. (am besten du schaust dir das mal bei MP3 an). Ist "DDE verwenden" aktiviert, kommt diese Meldung ("Das gleichzeitige öffnen ...") nicht mehr. Allerdings weiss ich nicht, wie dein Programm aussehen muss, um die Daten richtig zu verarbeiten. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
ich habe jetzt herausgefunden, dass man mit IICONTEXTMENU die markierten dateien im explorer ermitteln kann. da das aber unbekanntest gebiet für mich ist, bräuchte ich einen link für nen tutorial bzw. jemand erklärt mir, wie ich mein problem mit dieser neuen erkenntnis lösen kann.
wenn ich nämlich mit nur einer neuen (2.) instanz alle dateinamen auf einmal an meine hauptinstanz schicken kann, muss sich nur die neue (2.) instanz schließen und das geht so schnell, dass man es nicht mehr bemerkt. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
ich habe hier mal etwas gefunden, was bestimmt das ist, was ich brauche. allerdings bin ich beim erstellen eines IDataObjectshängen geblieben ;_; kann mir jemand helfen?
Delphi-Quellcode:
function TDFKontextMenuShellExt.SEInitialize(pidlFolder: PItemIDList;
lpdobj: IDataObject; hKeyProgID: HKEY): HResult; var StgMedium: TStgMedium; FormatEtc: TFormatEtc; Idx: Integer; begin if (lpdobj = nil) then begin Result := E_INVALIDARG; Exit; end; with FormatEtc do begin cfFormat := CF_HDROP; ptd := nil; dwAspect := DVASPECT_CONTENT; lindex := -1; tymed := TYMED_HGLOBAL; end; Result := lpdobj.GetData(FormatEtc, StgMedium); if Failed(Result) then Exit; // alle ausgew�hlten Dateien ermitteln for Idx := 0 to DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0) - 1 do begin DragQueryFile(StgMedium.hGlobal, Idx, FFileName, SizeOf(FFileName)); // hier k�nnen die Dateinamen eingesammelt werden, z. B. // StringListe.Add(FFileName); end; ReleaseStgMedium(StgMedium); Result := NOERROR; end; |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Zitat:
Thomas |
Re: Parameter SCHNELL an Hauptprog weiterleiten
so, ich habe jetzt mal in mein programm die DDE Komponenten eingebaut, aber ich erhalte jedesmal die Fehlermeldung: "Die Datei Filename.ext konnte nicht gefunden werden". Dabei ist es total egal, welche Datei ich öffne. Hab mir natürlich das Tut durchgelesen und fürn Anfang alles übernommen. Doch selbst in dem Tut gibt es mind. einen Fehler:
Zitat:
|
Re: Parameter SCHNELL an Hauptprog weiterleiten
Moin Nogge,
Zitat:
Wie hast Du denn das hinbekommen. Also bei mir enthält paramstr(0) den gesamten Pfad meiner Anwendung inclusive des Dateinamens. Nicht richtig falsch (;-)) aber unsauber:
Delphi-Quellcode:
besser:
regist.WriteString('', Paramstr(0)+' %1');
Code:
Ansonsten bekommt man ein Problem, wenn entweder das Programm, oder aber der Übergebene Parameter ein oder mehrere Leerzeichen enthalten.
regist.WriteString('',[color=red][b]'"'+[/b][/color] Paramstr(0)+'[color=red][b]"[/b][/color] [color=red][b]"[/b][/color]%1[color=red][b]"[/b][/color]');
Falls es nicht deutlich zu lesen ist: Der Programmpfad und der Parameter werden jeweils in doppelte Anführungsstriche eingefasst. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
:oops: peinlich :oops:
Ich habe bisher nur ParamStr(0) in Verbindung mit ExtractFilePath benutzt und irgendwie beim Lesen diesen Teil einfach hinzugefügt, obwohl es im Tut nicht steht => Gewohnheit^^ Die Anführungsstriche habe ich sowieso schon in meinen Code hinzugefügt, jedoch bleibt das alte Problem. Ich habe nun herausgefunden, dass die Fehermeldung nur erscheint, wenn ich EINE Datei mit meinem Prog aufrufe. Wenn ich mehr als eine Datei öffne, startet mein Prog ohne Fehlermeldung. Selbst nachdem ich die Komponenten + Uses aus dem Quellcode entfernt hatte, blieb dieses eigenartige Verhalten. Erst nach dem Entfernen des Keys "..\ddeexec" aus der Registry, verschwand jegliche Fehlermeldung beim Start. Hoffe, dass euch diese Beschreibung für eine Lösung hilft. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Frohe Weihnachten Community^^
Tja, nun hab ich wieder Zeit, mich meinem Problem zu widmen und ihr hfftl auch ;-) Mein Problem mit den DDE Koponenten bestehen weiterhin. Kann aber auch sehr schnell Neues lernen, d.h. könnte mir nicht irgendjemand die ganz oben aufgeführte Methode erklären? Hab noch nirgends einen Ansatz an Hilfe in Form von Kommentaren bzw. Tutorials hier im Forum gefunden. Ist das wirklich soo schwer??? Naja, wäre sonst auch mit den DDE Kopmponenten zufrieden, wenn diese mehrere Dateien gleichzeitig und somit schnell weiterleiten können. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
So, ich habe jetzt mal die DDE Komponenten richtig in mein Programm implementieren können, jedoch hat die Methode immer noch nicht die gewünschte Geschwindigkeit. Außerdem ist das Programm während der Übertragung der Dateinamen ständig im Vordergrund und es erscheint immer noch eine Warnung, dass der Computer vllt nicht mehr reagieren könne, wenn ich so viele Dateien gleichzeitig öffne. Deshalb bin ich ebenfalls der Meinung, dass die Methode veraltet und somit zu langsam ist. Ich brauche daher nun wirklich mal einen netten Helfer bzw. Lehrer, welcher mir bei der letzten und somit hoffentlich schnellen Methode helfen kann.
Zitat:
Da ich nun Variante 1 und 2 ausprobiert habe und diese nicht die erwünschte Leistung gebracht haben, hoffe ich auf die letze Chance. |
Re: Parameter SCHNELL an Hauptprog weiterleiten
Zitat:
Boah !! .. und ansonsten kommst Du gut klar mit Deinen Mitmenschen ? :?: |
Re: Parameter SCHNELL an Hauptprog weiterleiten
tolle Antwort o_O
Das "wirklich" war auf den Helfer bzw. Lehrer bezogen, da mir hier noch niemand richtig weiterhelfen konnte. Außerdem wollen wir hier doch jetzt nicht wirklich eine Beziehung mit Liebe und Hass aufbauen, oder? ;-)) Also kannste mir auch nicht weiterhelfen, stoxx? ...schade |
Re: Parameter SCHNELL an Hauptprog weiterleiten
das gleich Problem habe ich auch :-( weiß denn keiner eine Lösung?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 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