IonStorm Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 Moin Ich komm mal direkt auf den Punkt, ich rufe vial ShellExecute ein Programm auf welches eine ganze Latte an Parametern besitzt, momentan erfolgt dies via einer Batchdatei, sprich diese wird aufgerufen, und die ruft dann wiederum die Applikation auf, funktioniert wunderbar, ist aber damit verbundne, dass ich zur Programmlaufzeit die BATCH-Datei erstellen muss. Was wäre, wenn ich an statt dessen einfach mir die Lange Ausführleiste in nen String hau, und den in ShellExecute einsetzte? Idee ist simpel, nur mit der Umsetzung harperts, da hab ich nämlich mal überhaupt keine Idee, wie ich das machen soll. Zum einen müsstne dann ja die Anführungszeichen vor ujnd nach der Auszuführenden Applikation weg, da er sonst denkt die Applikation würde so heissen wie der name es Strings lautet. Also lass ich die mal fein weck, aber irgendwie will der nicht so wie ich will. Und naja, jetzt halt allgemein die Frage ob das überhaupt möglich ist einen String einzusetzen, oder ob ich an einen festen "Wert" gebunden bin. Zitieren
Guybrush Threepwood Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 Also das ist jetzt nicht böse oder so gemeint aber du solltest erstmal ein Buch oder zumindest ein online Tutorial durcharbeiten das dir C oder C++ erklärt... Zitieren
IonStorm Geschrieben 22. Februar 2006 Autor Geschrieben 22. Februar 2006 Das mag deiner Meinung entsprechen, ich wäre über eine Antwort auf die Problemstellung dennoch erfreut. Die Basics der Konsolenprogrammierung lange genug beigebracht worden. Jetzt wird mir was aufgedrückt wos heisst mach mal, du bist zwar Systemintegrator und kein Anwendungsentwickler und du bekommst nen IDE mit dem du nicht zurrecht kommst und dem die Helpfiles fehlen, keine Bücher, und kaum Internetquellen die was Sinnvolles ausspucken was ich genau wissen möchte. Wenn du ein gutes Tutorial für mich ahst hab ich da auch voll und ganz ncihts dagegen, aber ich tappe bei der Suche nach sowas zur Zeit leider noch im Dunkeln. Zitieren
Klotzkopp Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 ich wäre über eine Antwort auf die Problemstellung dennoch erfreut. Dann fang doch mal mit einer guten Fehlerbeschreibung an. "irgendwie will der nicht so wie ich will" ist übrigens keine. Zitieren
Guybrush Threepwood Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 Das mag deiner Meinung entsprechen, ich wäre über eine Antwort auf die Problemstellung dennoch erfreut. Die Basics der Konsolenprogrammierung lange genug beigebracht worden. ...Wenn du ein gutes Tutorial für mich ahst hab ich da auch voll und ganz ncihts dagegen, aber ich tappe bei der Suche nach sowas zur Zeit leider noch im Dunkeln. Wenn du hier im Forum nach Tutorial oder Büchern suchst findest du dutzende Threads wo welche empfohlen werden. Und das hat nichts mit meiner Meinung zu tun sondern das das absolute Grundlagen sind wonach du hier fragst. Du bekommst hier gerne Hilfe bei Problemen, aber hier wird dir nicht programmieren beigebracht. Zitieren
IonStorm Geschrieben 22. Februar 2006 Autor Geschrieben 22. Februar 2006 Ok, also Fehlerbeschreibung: Ich habe es nach 2 Varianten versucht: Variante 1: std::string mapprinter="rundll32 printui.dll,PrintUIEntry /n "PDFCreator\" /y"; ShellExecute(NULL, "open", mapprinter, NULL, NULL, W_SHOWNORMAL); Variante 2: std::string mapprinter="rundll32 printui.dll,PrintUIEntry /n "PDFCreator\" /y"; ShellExecute(NULL, "open", "mapprinter", NULL, NULL, W_SHOWNORMAL); Variante 2 Schluckt der einfach so, beim Ausführen des Programms passiert aber mal genau garnichts: Eigentlich sollte der Drucker PDFCreator dadurch als Standart gemappt werden, es tut sich aber überhaupt nichts, das Programm läuft durch udn beendet sich und das wars. Ohne Fehlermeldung. Ist für mich schon verständlich, weil ich ihm durch die Anführungszeichen sage, dass "mapprinter" der Name des Files, welches ausgeführt werden soll. Was ja logischerweise nicht vorhanden ist. Bei Variante 1 tut sich dagegen beim Compilieren was, es kommt zum Fehler: error C2664: 'ShellExecuteA' : Konvertierung des Parameters 3 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'const char *' nicht moeglich Kein benutzerdefinierter Konvertierungsoperator verfuegbar, der diese Konvertierung durchfuehren kann, oder der Operator kann nicht aufgerufen werden Fehler beim Ausführen von cl.exe. wäre auch verständlich würde eben ausdrücken, dass ich nicht tun kann was ich vorhabe. Wäre meine Frage an die Fachleute hier, ob es ne Möglichkeit gibt wie ich dass doch kann. Zitieren
Klotzkopp Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 std::string mapprinter="rundll32 printui.dll,PrintUIEntry /n "PDFCreator\" /y"; [/CODE] Das sollte sich gar nicht kompilieren lassen, weil der Backslash vor den Anführungszeichen vor PDFCreator fehlt. [code]ShellExecute(NULL, "open", "mapprinter", NULL, NULL, W_SHOWNORMAL); ... Variante 2 Schluckt der einfach so, beim Ausführen des Programms passiert aber mal genau garnichts: Kein Wunder. Anführungszeichen um einen Variablennamen hat nicht den Effekt, den du hier erwartest. Du versuchst, das Programm "mapprinter" zu starten. Das gibt es vermutlich nicht. Da du den Rückgabewert von ShellExecute nicht prüfst, merkst du davon nichts. error C2664: 'ShellExecuteA' : Konvertierung des Parameters 3 von 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' in 'const char *' nicht moeglichDafür hat std::string die Methode c_str. Zitieren
IonStorm Geschrieben 22. Februar 2006 Autor Geschrieben 22. Februar 2006 Oh, das mit dem Backslash ist mein Fehler der ist mir beim Übertragen verloren gegangen. Im Orginal Sourcecode isser drin. Zitieren
Klotzkopp Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 Die Parameter des Shellbefehls kannst du übrigens nicht einfach anhängen, die gehören in den vierten Parameter von ShellExecute. Zitieren
IonStorm Geschrieben 22. Februar 2006 Autor Geschrieben 22. Februar 2006 Werden die Parameter dann einfach an der entsprechenden Postion von ShellExecute hintereinander eingesetzt, oder müssen die noch irgendwie von einadner mit einem Trennzeichen unterschieden werden? Ansonsten Danke ich dir schonmal Zitieren
Guybrush Threepwood Geschrieben 22. Februar 2006 Geschrieben 22. Februar 2006 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp Zitieren
IonStorm Geschrieben 22. Februar 2006 Autor Geschrieben 22. Februar 2006 hat sich schon erledigt, funktioniert jetzt im feldversuch so: std::string runit="rundll32"; std::string para="printui.dll,PrintUIEntry /n \"PDFCreator\" /y"; ShellExecute(NULL, "open",runit.c_str(), para.c_str(), NULL, SW_SHOWNORMAL); Danek nochmal Zitieren
IonStorm Geschrieben 23. Februar 2006 Autor Geschrieben 23. Februar 2006 Noch eine Frage dazu, weiss jemand wieviel Zeichen die Parameteraufnahme von ShellExecute maximal aufnehmen kann? Also die maximale Zeichenanzahl. Bzw. die maximale Zeichenanzahl die ein String haben kann? Zitieren
Klotzkopp Geschrieben 23. Februar 2006 Geschrieben 23. Februar 2006 Hast du ein konkretes Problem, oder fragst du nur aus Interesse? Die maximale Zeichenanzahl in einem String sollte nur durch die Computerarchitektur und den verfügbaren virtuellen Speicher begrenzt sein. Zitieren
IonStorm Geschrieben 23. Februar 2006 Autor Geschrieben 23. Februar 2006 Das Problem ist folgendes, mit den weiter oebn stehenden Parametern zur rundll32 mappe ich einen installierten Drucker als Standart. Wenn ich die Parameter anfüge die der Installation dienen wird das ganze um einiges länger. std::string runit="rundll32"; std::string para="printui.dll,PrintUIEntry /if /b \"HP LaserJet 4000 Series PCL\" /f %%windir%%\\inf\\ntprint.inf /r \"IP_IP-Zensiert\" /m \"HP Laserjet 4000 Series PCL\""; ShellExecute(NULL, "open",runit.c_str(), para.c_str(), NULL, SW_SHOWNORMAL); Der Compiler hat damit kein Problem, das einzige was ist, ist das das ganze beim Ausführen auf Fehler läuft, sprich er führt die Parameter wohl nicht vollständig aus. Daher frage ich. Zitieren
Klotzkopp Geschrieben 23. Februar 2006 Geschrieben 23. Februar 2006 Abgesehen davon, dass die Prozentzeichen doppelt sind: ShellExecute expandiert nicht automatisch Umgebungsvariablen in den Strings. Darum musst du dich selbst kümmern. Zitieren
IonStorm Geschrieben 23. Februar 2006 Autor Geschrieben 23. Februar 2006 wenn es grade um die Sache mit %windir% geht, das ist so von der Syntax her korrekt, wenn ich es über die Commandline direkt eintippe, also abschreibe, funktioniert es ja auch, sprich der muss das eigentlich blos übertragen. Edit: habs grad ausprobiert, hast recht, in dem Fall behaupte ich sofort das Gegenteil, der würde die wohl nur expandieren, wenn ich die Commandline aufrufen würde, und an dieser das Auszuführende übertrage. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.