Announcement

Collapse
No announcement yet.

Mehrere Startparameter verarbeiten

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Mehrere Startparameter verarbeiten

    Hallo,

    ich habe eine Anwendung mit registrierten Dateitypen um genauer zu sein mit *.mp3 Dateien. Wenn ich eine MP3 Datei mit der rechten Maustaste anklicke und auf Öffnen klicke, so startet mein Programm und verarbeitet den Startparameter. Gehen wir mal davon aus das meine Anwendung nicht gestartet ist. Jetzt habe ich das Problem das ich mehrere mp3 Dateien markiere und dann auf öffnen klicke und meine Anwendung startet. Dabei werden allerdings nicht alle Parameter verarbeitet. Es ist ja so das pro markierter Datei meine Anwendung einmal starten müsste. Ich möchte es aber erreichen das die Anwendung nur einmal startet, aber alle weiteren Parameter in der gestarteten Version verarbeitet werden.

    Ich mache es um genau zu sein im Moment so, daß ich beim Programmstart noch vor dem Application.Initialize prüfe ob es ein Handle auf mein Hauptformular gibt. Existiert es so Poste ich eine Message per WM_COPYDATA mit dem Startparameter an meine Hauptanwendung. Ist meine Hauptanwendung gerade am starten so kommt es vor das einige Messages gar nicht verarbeitet werden. Das ganze funktioniert übrigens sehr gut wenn die Anwendung schon gestartet ist.

    Diese Funktion, die ich benötige ist im Prinzip die gleiche Funktion wie die Enqueue-Funktion bei Winamp!!!

    So... nun zu der goldenen Frage. Wie mache ich es am geschicktesten mehrere zum Beispiel 20 jeweils einzelne Startparameter an eine noch nicht gestartet Anwendung zu übergeben? Ich habe in diesem Zusammenhang schon mal DDE gehört! Funktioniert genau das mit DDE besser? Ist DDE überhaupt noch Zeitgemäß?

    Danke für eure Antworten.

    Gruß Rainer

  • #2
    Hallo,

    ich weiss nicht genau, ob es das ist, was Du willst:

    <pre>
    for i := 0 to ParamCount -1 do
    begin
    ...
    end;
    </pre>

    Dies wertet alle Parameter aus, die Du Deinem Programm übergibst, z. B. in der Form
    <pre>
    MP3Player.exe "qay.mp3" "wsx.mp3" "edc.mp3" ........
    </pre>

    Nun gibt es ParamStr() mit dem Du alle Parameter auswerten kannst, hierbei ist ParamStr(0) Deine Anwendung incl. Pfad, ParamStr(1) ist der erste Parameter usw.
    Schau mal in der Hilfe.

    Gruß Michae

    Comment


    • #3
      Such mal hier im Forum nach "Mutex" und "Instance" - da sollte was Relevantes dabei sein.
      <br>Uli

      Comment


      • #4
        Hallo,

        ich denke du spielst mit Mutex auf den mehrfachen Programmstart an. Das ist aber gar nicht mein Problem. Trotzdem danke...

        Gruß Raine

        Comment


        • #5
          So ungefähr. :-)
          <br>Wenn ich dich richtig verstanden habe, soll von deiner Anwendung maximal immer nur eine Instanz laufen (was du laut Posting 2 schon hingekriegt hast), und ggfs. musst du eine schon laufende Instanz dazu kriegen, nachträglich noch weitere mp3's zu bearbeiten?
          <br>Das wäre doch in etwa Posting #28 ff. von <a href="/webx?14@@.ee8c498/27">Hagen Reddmann "Mehfachen Programmstart verhindern" 06.03.2003 16:57</a> ?
          <p>Ciao, Uli

          Comment


          • #6
            So ungefähr. :-)
            <br>Wenn ich dich richtig verstanden habe, soll von deiner Anwendung maximal immer nur eine Instanz laufen (was du laut Posting 2 schon hingekriegt hast), und ggfs. musst du eine schon laufende Instanz dazu kriegen, nachträglich noch weitere mp3's zu bearbeiten?
            <br>Das wäre doch in etwa Posting #28 ff. von <a href="/webx?14@@.ee8c498/27">Hagen Reddmann "Mehfachen Programmstart verhindern" 06.03.2003 16:57</a> ?
            <p>Ciao, Uli

            Comment


            • #7
              Es gibt einfachere Wege. Zb. über DDE Kommunikation von der Shell zur eigenen Anwendung. Benötigt wird nur ein TDDEServerItem. Ich verweise ungern auf andere Delphi Foren hier, aber im Delphi Praxis Forum gibt es einen Thread darüber.

              Der Weg über DDE ist aber langsam im Aufruf. Wesentlich schneller und am effiezientesten wäre ein IContextMenu-Handler als COM Object bei der Shell zu registrieren. D.h. deine Anwendung stellt zu den registrierten Dateien ein COM Object zur Verfügung das für das Contextmenu im Explorer verantworlich ist. In diesem Moment bekommt du alles frei Haus.
              Im delphi DEMO Ordner solltest du bei ActiveX/ShellExt alls finden.

              Gruß Hage

              Comment


              • #8
                Hi,

                wenn ich mit IContextMenu arbeite und dann meinetwegen 30 Dateien vom Typ "mp3" markiere und die dann Öffne, wie werden die Parameter dann verarbeitet??? Ich gehe davon aus das meine Anwendung nicht gestartet ist. Wird jeder Parameter (der einer Datei entspricht) über das IContextMenu an meine Anwendung geschickt und obwohl sie noch nicht gestartet ist geht kein Parameter verloren? Gibt es dazu nicht ein einfaches Beispiel? Das in Delphi habe ich mir schon angeschaut, aber wie ich es jetzt sinnvoll einsetzen könnte weiß ich nicht! Ich weiß auch nicht wirklich ob damit genau mein Problem gelöst wird. Im Moment bin ich ein wenig verwirrt

                Gruß Raine

                Comment


                • #9
                  Der Explorer übergibt eine Struktur die alle selektierten Dateien enthält.
                  Dazu muß IContextMenu und IShellExtInit benutzt werden. IShellExtInit übergibt ein IDataObject und eine PItemIDList in .Initialize(). Ich persönlich preferiere das IDataObject und extrahiere darus die Dateien.

                  <pre>
                  function FilesFromDataObject(DataObject: IDataObject; Files: TStrings; Format: Integer): Boolean;
                  var
                  StgMedium: TStgMedium;
                  FormatEtc: TFormatEtc;
                  S: String;
                  I: Integer;
                  begin
                  Result := False;
                  if (DataObject <> nil) and IsObject(Files, TStrings) then
                  try
                  Files.Clear;
                  with FormatEtc do
                  begin
                  cfFormat := Format;
                  ptd := nil;
                  dwAspect := DVASPECT_CONTENT;
                  lindex := -1;
                  tymed := TYMED_HGLOBAL;
                  end;
                  if Succeeded(DataObject.GetData(FormatEtc, StgMedium)) then
                  try
                  I := DragQueryFile(StgMedium.hGlobal, $FFFFFFFF, nil, 0);
                  while I > 0 do
                  begin
                  Dec(I);
                  SetLength(S, MAX_PATH * 2);
                  SetLength(S, DragQueryFile(StgMedium.hGlobal, I, PChar(S), MAX_PATH * 2));
                  Files.Add(S);
                  end;
                  Result := True;
                  finally
                  ReleaseStgMedium(StgMedium);
                  end;
                  except
                  end;
                  end;
                  </pre>

                  Format = CF_HDROP;

                  Gruß Hage

                  Comment

                  Working...
                  X