c++ Parameterübergabe an Programm

Tag Leutz,

habe folgendes Problem:

möchte mein geschriebenes programm gern mit mehr als nur einer datei starten, d.h. wenn ich mehrere dateien markieren und diese mit dem prgramm ausführe, sollen alle dateipfade übergeben werden. weiiß jetz nicht wie ich das machen soll. ich bekomme nur immer den dateinamen übergeben, den ich in der markierten liste rechts angeklickt habe. argv liefert mir also nur dieses eine parameter. wie machen windowsprogramme denn bitte sowas. ich möchte die datei ungern so oft aufrufen, wie ich dateien habe.

bin für jede hilfe dankbar.

gruss christian
 
dann starte das programm halt nicht per drag&drop sondern.
start.exe datei1 datei2 dateiN

eventuell alles in eine batch datei schreiben, dann ists mit einem klick auf diese datei getan
 
naja das problem ist halt, dass ich sie quasi so markieren muss und dann auch so übergeben soll. über do geht das ohne probleme ja indem ich alle dateinamen dahinter schreibe. aber andere programme können doch auch mehr als eine datei mit "einem" aufruf(ganz wichtig) verarbeiten. hab auch schone nen extra kontextmenüeintrag für mein programm geschrieben, womit er dann halt das programm aufruft. wenn z.b. 100 dateien verarbeiten will macht der aber 100 mal das prog. auf. und gerade das soll er nicht. das dauert ewig.

mit batch dateien hab ich mich noch nie beschäftigt. aber da müsste die .bat ja auch mehrfach aufgerufen werden oder irre ich mich da???

gruss christian
 
Ich weis nicht, ob ich richtig verstanden hab, wo genau das Problem liegt. Ich versuchs einfach mal ^^
-Ein von dir geschriebenes Programm soll aufgerufen werden
-Als Parameter sollen eine unbestimmt riesige Menge an absoluten Dateinamen folgen.
(absoluter Dateiname z.B.: C:\irgendwas\myprog.exe steht im Gegensatz zum relativen Dateinamen/Pfad, z.B.: ordner\myprog.exe)

1.Möglichkeit:
Ich glaube das geht sogar, indem du mehrere Dateien markierst und per Drag&Drop über die exe Datei ziehst.

2.Möglichkeit: (mein Favorit ^^)
Du erstellst eine *.bat Datei mit dem Inhalt
dir *.flv /b >liste.txt
welches eine Dateiliste von einem Ordner erstellt. Diese Liste lädst du dann mit deinem Programm und hast nun auch alle Infos die du brauchst, nur halt nicht über Startparameter.

3.Möglichkeit:
So wie mauralix gesagt hat ^^

Wenn du allerdings ein anderes Programm, das die Infos verarbeitet, von deinem aus aufrufen willst, dann kannst du das mit
WinExec ("anderesProg.exe Param1 param2", SW_SHOW);
aufrufen.
Wenn du das andere Programm dabei auch noch überwachen willst wirds komplizierter ^^
[C++6.0/Win] prüfen ob prozess läuft

Naja, hab mal wild mit dem Schwert in die Luft geschlagen, weil ich nich ganz wusste was du meinst xD
 
mein problem ist halt, dass ich eine datenbank entwickeln soll, in die jeder anwender die für ihn interessanten daten(also die daten, die er markiert) in diese datenbank einfügen soll. deshalb hab ich ja diesen kontextmenüeintrag programmiert, deshalb würde das über die datei ziehen wenig sinn machen. mit batch dateien hab ich leider noch nie gearbeitet und weiß auch nicht ob das perfomanceverlust dabei entsteht, jedoch hört sich das für mich am plausibelsten an. kannste mir vielleicht mal ne beispiel geben???

danke danke
 
@Extinction:
Die erste Möglichkeit funktioniert sehr wohl, hab ich gerade ausprobiert.

Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
  int i=0;
  
  printf("Folgende Dateien wurden darueber gezogen bzw. sind parameter\n");
  for(i=1;i<argc;i++)
  {
  
              printf("%s\n",argv[i]);       
  }
  
  system("PAUSE");	
  return 0;
}
 
Afaik gibt es keinen so einfachen Weg, wenn man es selber realisieren möchte.
Ich nehme an, die Anwendung ist in der Registry für bestimmte Datentypen eingetragen.
(shell ->command->open->"pfad\anwendung.exe %1")
Eigentlich müsste man nur feststellen, ob das Programm schon läuft (z.b mit einem Mutex) und gegebenfalls die per Commandline übergebenen Paramter senden (Pipes, Sockets, Windowsnachrichten, SharedMemory). Winamp z.B macht es auch nicht anders:
Eintrag in der Registry für Enqueue:
Code:
HKEY_CLASSES_ROOT\Winamp.File\shell\Enqueue\command
"F:\oldc\Programme\Winamp\winamp.exe" /ADD "%1"
für "normales" Öffnen:
Code:
HKEY_CLASSES_ROOT\Winamp.File\shell\open\command
"F:\oldc\Programme\Winamp\winamp.exe" "%1"
Wobei: wo liegt das Problem, dass mehrere Programme gleichzeitig gestartet werden? Wenn sie den Eintrag in die Datenbank hinzufügen und sich dann schließen, stört es doch keinen ;). Gegebenfalls setzt man die Anwendung als "Win GUI" anstatt "Win32 Console" (wie es genau geht, hängt von der verwendeten IDE bzw Linker ab). Dann erscheint auch kein schwarzes Fenster.
 
ah das klingt ja interessant. also wichtig ist mir eigentlich nur, dass wenn ich beispielsweise 300 dateien add, dass der pc nicht ewig braucht und die performance nicht in den keller geht. am besten ist halt wenn ich die markierten dateien über das kontextmenü so an das programm übergeben kann. dieses /ADD macht das?? oder hab ich das falsch verstanden??
 
Dein Programm sollte dann schon mit dem Parameter "/ADD" etwas anfangen können. Am Beispiel Winamp bedeutet dies, dass die mit $1 angegebene Datei ans Ende der Playlist aufgenommen wird. Dies macht aber nicht Windows, sondern Winamp, weil es weiss, wenn es mit "/ADD irgendne_Datei" aufgerufen wird, diese dann an die Playlist anhängt.

BTW: Was mir total spanisch vorkommt, dass Windows alle Datein einzeln mit je einem neuen Aufruf übergibt, denn normalerweise sollte nur ein Aufruf stattfinden mit deinen Datein als Parameter.
 
Original von HackerNeo
dieses /ADD macht das?? oder hab ich das falsch verstanden??
Nein, das ADD macht es nicht ;).Das gehört zu WinAmp.
Ich wollte damit nur ein Beispiel angeben, dass es auch in "großen" Programmen so gemacht wird - und hier würde wahrscheinlich schon eine andere Lösung von den Programmierern genutzt werden, wenn es (mit vertretbarem Aufwand) umsetzbar wäre.
Wenn es schnell gehen muss, kannst Du für diese Aufgabe auch ein "extra" Programm verwenden, das eben nur diese eine Aufgabe macht. Somit sollte es nicht so lange dauern, es zu starten. Was ich bis jetzt an Lösungen zu diesem Problem gesehen habe, gingen alle in diese Richtung. Man könnte auch statt direkten Datenbankeintrag erstmal alles in einer (Text) Datei sammeln und erst wenn der Benutzer das Hauptprogramm startet das Zeug hinzufügen.
 
es wäre bloß sehr unkomfortabel wenn der benutzer mehrere gänge tätigen müsste. man ey warum muss windows einem immer alles so verbauen. manche programme öffnen sich aber doch auch nur einmal obwohl mehrere dateien übergeben werden.

gibts nicht die möglichkeit, die parameter so zu übergeben, als wenn ich die dateien alle über das programm ziehen würde??
 
Zurück
Oben