Entwickler-Ecke
Dateizugriff - shellexecute mit parametern
D. Annies - Di 18.05.10 17:31
Titel: shellexecute mit parametern
Hi, Delpher,
ich möchte Shellexecute so aufrufen, dass das aufgerufene ProgrammFormular mit speziellen Setbounds-Werten gestartet wird.
Bisher habe ich:
Delphi-Quelltext
1: 2:
| ShellExecute(Handle, nil, pchar(label30.caption+ '\ynot\suchep.exe'), nil, nil, SW_Show); labelanz.caption := inttostr(TbSchueler.recordcount); screen.cursor := crdefault; |
aber die Setbounds-Werte, die in OnFormShow des aufgerufenen Programms stehen, werden nicht genommen, sondern nur eine
Standardeinstellung.
Wie kann man das ändern?
Danke für Hilfe, =;))
Detlef
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Di 18.05.2010 um 18:36
Xentar - Di 18.05.10 18:51
Und was hat das mit Shellexecute und Parametern zu tun? Du übergibst ja nichtmal nen Parameter..
Ich würde eher sagen, das ist ein Problem im Ereignis "OnShow" des aufgerufenen Programms, dass die Werte nicht übernommen werden.
Delete - Di 18.05.10 19:27
Hast du dein Programm auch so programmiert, dass es das Setzen der Fensterposition mit Parametern unterstützt?
D. Annies - Di 18.05.10 20:22
Na, ihr seid ja wieder gut drauf, heute. :))
Gibt's auch so etwas wie eine Lösung? Mit Parametern? Ohne Parameter? Mit Konstanten? Mit Variablen?
Die Lösung bekommt auch eine Schleife! Wegen der Abbruchbedingung frage ich dann wieder, ok?
Gruß, Detlef
Xentar - Di 18.05.10 20:32
Äh, ist das dein Ernst?
Bei ShellExecute kannst du als 4. Parameter die Aufrufparameter mitgeben.. also ersetze "nil" durch das, was du übergeben willst..
Btw.: Ich weiß nicht, ob nil als Operator (2. Parameter) so gut ist. Versuchs mal mit 'open'
D. Annies - Mi 19.05.10 11:47
Ich habe noch vergessen, zu sagen, dass ich auf die Hilfe (F1) zurzeit nicht zugreifen kann, sonst wäre es ja auch etwas einfacher, die Bedeutung der Parameter zu erkennen.
Soll heißen, ich weiß noch nicht weiter,
Gruß, Detlef = ; ))
Xentar - Mi 19.05.10 11:57
Der MSDN Artikel wurde bereits verlinkt - reicht das als Hilfe? :D
D. Annies - Mi 19.05.10 12:01
Leider noch nicht, ich habe jetzt als letzten Wert (also als 6. Wert) den Inhalt 4 und den Inhalt 5 eingetragen (statt NIL),
aber es tut sich nichts.
MaPsTaR - Mi 19.05.10 14:39
Hallo,
wenn du hier wirklich Hilfe erwartest, bräuchte ich den besagten Code des aufzurufenden Programms, in dem du die Parameter auswertest und an SetBounds übergibst.
Warum setzt du die bereits genannten Vorschläge nicht um???
2. Parameter: 'open'
4. Parameter: die zu übergebenden Parameter
5. Parameter: nil
6. Parameter: SW_SHOW
Zu den Parametern kann ich der erst mehr sagen, wenn ich weiß, wie das aufgerufene Programm diese verwertet...
D. Annies - Mi 19.05.10 21:47
Ich komme da ohne ein Beispiel leider nicht weiter - Das Problem habe ich glaube ich,
verständlich beschrieben.
Gruß, Detlef
Xentar - Mi 19.05.10 21:55
Bevor wir hier noch wochenlang rumdoktorn.. (ich versteh leider nicht, wie man sich an einer Zeile so schwer tun kann?)
Delphi-Quelltext
1:
| ShellExecute(Handle, 'open', 'c:\test\test.exe', '-Hallo', nil, SW_Show); |
Damit sollte das Programm test.exe mit Parameter "-Hallo" aufgerufen werden. Stattdessen kannst du natürlich auch eine Variable verwenden (String, und dann auf PChar casten), aber das bekommst du wohl hin..?
Und wenn du noch so tust:
Delphi-Quelltext
1: 2: 3:
| var muh: integer; begin muh := ShellExecute(Handle, 'open', 'c:\test\test.exe', '-Hallo', nil, SW_Show); |
Kannst du muh sogar gegen die auf der Webseite angegebenen Fehlercodes vergleichen, und rausfinden, warum das nicht klappt (in diesem Fall: ERROR_FILE_NOT_FOUND).
Hoffe wir habens nun..
D. Annies - Do 20.05.10 08:18
Hi Xentar,
erstmal vielen Dank, dass du dich um mein Problem kümmerst, aber es soll dir nicht zur Last werden.
das Problem bei unserem "rumdoktern" ist ein ganz anderes, bzw. das Folgende:
Dir ist eine symbolische Lösung - z.B. mit dem Parameter '-Hallo' völlig klar, obwohl die Fehlermeldung für mich eher
damit zu tun hat, dass es die aufgerufene exe gar nicht gibt.
Mir fehlt ein explizites Beispiel etwa der Art
ShellExecute(Handle, 'open', 'c:\test\test.exe', 'setbounds(100,50,500,300)', nil, SW_Show);
[was natürlich quatsch ist]
--Oder ist es gar nicht möglich, setbounds zu übergeben?
Ist es doch ein Problem des OnShow des aufgerufenen Prg's?
Wie ist das denn dann zu lösen?
Beachte bitte: Für einen Lernenden ist so ein Problem unüberwindlich - für einen Lehrenden (in diesem Fall du) besteht
die Kunst nicht in der "Verschleierung" oder in einer ermunternden Aufforderung -das wirst du ja wohl hinkriegen,
sondern einfach in einem praktischen Beispiel, nach dem Motto: schreib Folgenden Code hin ...
Der Lernende (in diesem Fall ich) wird dann schon weiterdenken und es auf andere Inhalte ausdehnen können.
Viele Grüße,
Detlef
jaenicke - Do 20.05.10 08:32
Du kannst nicht einfach Code übergeben. Den oder die Parameter muss das gestartete Programm schon auch benutzen. Und dieser Versuch sieht sehr danach aus als unterstützte das Zielprogramm derartige Parameter nicht. (Wenn, dann jedenfalls bestimmt nicht so, sondern einzeln.)
Da du auf das aufgerufene Programm keinen Einfluss hast (den Code hast du ja nicht), musst du das Formular nach dem Start der Anwendung selbst positionieren. Dafür fällt mir spontan CreateProcess ein, weil du damit Zugriff auf das aufgerufene Programm hast (um genau zu sein bekommst du Handle und ID des Prozesses).
Dann kannst du mit EnumWindows alle Fenster durchgehen und in dem Callback schauen, ob es zu deinem Prozess gehört. Wenn das der Fall ist, kannst du dann die Position setzen.
D. Annies - Do 20.05.10 10:08
Hi, Sebastian,
nun, das aufgerufene Programm ist auch ein Delphi-Prg, hatte ich bisher noch nicht gesagt, weil ich nicht dachte, dass es
wichtig sei.
Ich kommuniziere auch schon mit diesem Prg:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TPatMatForm.ReadStrVariable; var H: THandle; begin H := FindWindow('TBuchMain', NIL); PostMessage(H, WM_READSTR, 0, 0); end;
procedure TPatMatForm.ReceiveStrVariable(var msg: TWMCopyData ); var sText : array[0..256] of Char; begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); qFname := sText; Label11.Caption := qFname; Label11.Caption := MinimizeName(qFname, Label11.Canvas, Label11.Width); Label11.Hint := qFname; end; |
(Das ist Code aus dem aufgerufenen Prg mit dem Formularnamen TPatMatForm.
Das rufende Prg hat den Formularnamen TBuchMain)
Na, ja, ob das weiterhilft?
Gruß, Detlef
---
Moderiert von
Narses: Beiträge zusammengefasst---
Oh, weiah! :shock: :? :? :shock:
Wenn ich das aufgerufene (Delphi-)Prg aus Delphi heraus starte, hat das Formular die eingestellte Größe (setbounds)!
Wenn ich es als exe starte, nicht, sondern den Standardwert.
Wenn ich es aufrufe, auch nur den Standardwert.
Was ist denn da los??
Detlef
MaPsTaR - Do 20.05.10 17:19
Ich weiß wirklich nicht, was daran so schwer ist...
Aber naja. Der folgende Code ist zwar nur schnell zusammengeschrieben, funktioniert aber.
Aufruf des Programmes:
Delphi-Quelltext
1:
| ShellExecute(Handle, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'Project1.exe'), PCHar('100 100 800 600'), nil, SW_SHOW); |
FormShow des aufgerufenen Programmes:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.FormShow(Sender: TObject); var Bounds: Array[0..3] of integer; begin if ParamCount > 1 then Bounds[0] := StrToIntDef(ParamStr(1), Form1.Left) else Bounds[0] := Form1.Left; if ParamCount > 2 then Bounds[1] := StrToIntDef(ParamStr(2), Form1.Top) else Bounds[1] := Form1.Top; if ParamCount > 3 then Bounds[2] := StrToIntDef(ParamStr(3), Form1.Width) else Bounds[2] := Form1.Width; if ParamCount > 4 then Bounds[3] := StrToIntDef(ParamStr(4), Form1.Height) else Bounds[3] := Form1.Height; Form1.SetBounds(Bounds[0], Bounds[1], Bounds[2], Bounds[3]); end; |
Dadurch sollte SetBounds, in diesem Beispiel mit folgenden Werten aufgerufen werden.
Delphi-Quelltext
1:
| SetBounds(100, 100, 800, 600); |
D. Annies - Do 20.05.10 20:46
Vielen Dank für die Hilfe, besser als F1 und noch einmal gesagt: Was für dich leicht ist, war für mich nicht erkennbar, - jetzt allerdings ganz klar. Jeder ist mal Lernender und mal Lehrender!
Viele Grüße aus Lübeck,
Detlef
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Xentar - Do 20.05.10 21:07
D. Annies hat folgendes geschrieben : |
Vielen Dank für die Hilfe, besser als F1 und noch einmal gesagt: Was für dich leicht ist, war für mich
nicht erkennbar, - jetzt allerdings ganz klar. Jeder ist mal Lernender und mal Lehrender! |
Sorry, aber ich persönlich neige wohl zu sehr dazu, auf die Posts zu achten.
Wenn ich sehe, dass jemand schon über 6 Jahre hier im Forum ist, und über 1500 Posts hat, geh ich immer direkt davon aus, dass derjenige nen Profi ist :(
D. Annies - Do 20.05.10 21:30
Hi, Xentar,
für dich mag das so auch richtig sein! Für mich gilt nur, dass ich 1500 Fragen hatte, - die übrigens alle beantwortet wurden - und immer noch am dazulernen bin.
Übrigens, was ist denn ein Profi?
Ich übe seit langer Zeit einen sehr schönen Beruf aus, aber ich würde höchstens sagen, dass ich "lebenslänglich" habe, aber ein Profi? Es gibt doch immer wieder Neues, auch zu entdecken!
Vielen Dank an dich und alle anderen Helfer.
Detlef
Moderiert von
Narses: Überflüssige Zeilenumbrüche/Leerzeilen entfernt.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!