Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Parameter bei Shellexecute übergeben (https://www.delphipraxis.net/1748-parameter-bei-shellexecute-uebergeben.html)

S - tefano 20. Dez 2002 21:40


Parameter bei Shellexecute übergeben
 
Hi,

mein Programm besteht quasi aus 2 Unterprogrammen. (ein Netzwerk- Chat. Die gibts zwar wie Sand am Meer, aber ich wollt mal wieder was machen)
Das eine Programm überprüft ein Verzeichnis, ob neue Requests da sind (Dateien, in denen Clients die das eigene Programm kontaktieren wollen z.B. ihre IP und ihren Port reinschreiben).
Wenn ein neuer Request da is, soll die zweite Exe gestartet werden. Diese kann man in mehreren Instanzen starten, soll quasi in etwa so laufen wie son ICQ- Messagewindow.
Da ich ja wenn ich mehrere Instanzen habe nich einfach der Exe ne Datei vorlegen kann wo alles drinsteht (die kann man ja nicht unterscheiden), will ich die nötigen Daten wie Port und IP per Paramstring übergeben.
Die Exe starten kann ich ja mit ShellExecute.
Jetz meine Frage:
Wie muss ich den PChar (den ich Shellexecute übergeben muss - wo der auszuführende Dateiname drinsteht) verändern, damit das Programm den Paramstring auch erkennt?
Einfach so: 'meinprog.exe -parameter' oder wie?
Wenn ich mir mal diese Verknüpfungen alle mal anguck, dann mac hen die das ja irgendwie alle anders...

Danke schonmal

S - tefano

Chewie 21. Dez 2002 11:50

Dafür ist bei ShellExecute der vierte Parameter da:
Delphi-Quellcode:
ShellExecute(Handle,'open','C:\Anwendung.exe','parameter1 parameter2','',SW_SHOW);

S - tefano 21. Dez 2002 13:33

Hi,

cool, danke!
Und die Parameter werden einfach durch ein Leerzeichen abgetrennt?

Bis dann,

S - tefano

Chewie 21. Dez 2002 13:34

Zitat:

Zitat von S - tefano
Hi,

cool, danke!
Und die Parameter werden einfach durch ein Leerzeichen abgetrennt?

Bis dann,

S - tefano

Ja.

CalganX 21. Dez 2002 13:35

Ja, aber du solltest ggf. dein Programm prüfen lassen, ob ggf. ein Parameter aus mehreren Wörtern da ist!

Chris

d3g 21. Dez 2002 13:56

Dann müssen die zusammengehörenden Wörter in Anführungsstriche gesetzt werden.

Luckie 21. Dez 2002 14:25

Alle nicht Integer-Parameter sind vom Typ PChar, also ein Zeiger auf eine Zeichenfolge, dewegen sollte man statt '' besser nil übergeben, wenn man den Parameter nicht benutzt.

S - tefano 21. Dez 2002 14:29

Hi,

wunderbar, danke nochmal für Eure Hilfe!
Bin jetz n ganzes Stück weitergekommen.

Bis dann,

S - tefano

Chewie 21. Dez 2002 17:13

Zitat:

Zitat von Luckie
Alle nicht Integer-Parameter sind vom Typ PChar, also ein Zeiger auf eine Zeichenfolge, dewegen sollte man statt '' besser nil übergeben, wenn man den Parameter nicht benutzt.

Was macht das eigentlich für einen Unterschied?

Luckie 21. Dez 2002 17:20

Du verläßt dich auf den Compiler, dass er es richtig umwandelt. Fällt, glaube ich, unter das Stichwort: "Compiler Magic". Also besser gleich einen Zeiger übergeben, wenn ein zeiger erwartet wird. Und ihr brauchen wir eben einen NULL-Zeiger, wenn wir keine Zeichenkette übergeben wollen.

Chewie 21. Dez 2002 17:24

D.h. also, der Compiler macht aus 'Irgendein String' PChar('Irgendein String'), wenn ein PChar benötigt wird?[/b]

Fast. Beispiel:
Delphi-Quellcode:
var
  s: String;
begin
  s := 'Hello world';
  Shellexecute(0, 'open', s, nil, nil, SW_SHOW);
Das geht nicht.
Aber:
Delphi-Quellcode:
  Shellexecute(0, 'open', 'Hello world', nil, nil, SW_SHOW);
Das geht.

Im ersten Fall ist s ein String und bleibt es auch. Im zweiten Fall macht der Compiler aus 'Hello world' einen nullterminierenden String.

Möglichkeiten, um aus s einen nullterminierenden String zu machen:
  • Mit PChar casten: PChar(s). PChar gibt die Adresse des ersten Zeichens zurück. Wenn der String leer ist, wird ein NULL-Zeiger zurückgegeben.
  • Direkt die Adresse des ersten Zeichens angeben: Integer(@s[1]). Dies erzwingt einen Aufruf von UniqueString, welche sicher stellt, dass eine gültige Adresse zurückgegeben wird. Davor erfolgt noch ein Aufruf von setlength.
    Delphi-Quellcode:
    procedure UniqueString(var str: string); overload;
    Zitat:

    Following a call to SetString, str is guaranteed to reference a unique string—that is, a string with a reference count of one. For normal string handling, there is no need to call UniqueString. UniqueString is used only in cases where an application casts a string to a PChar or PWideChar and then modifies the contents of the string.
    Wird also auch bei einem Cast mit PChar aufgerufen.
  • pointer(s), hier wird einfach der String zu einem Pointer gecastet. Das ist auch gleichzeitig die schnellste Methode, da keine versteckten Funktionsaufrufe, wie bei einem Cast mit PChar, durchgeführt werden.
Nach zu lesen hier: High Performance Delphi - String Optimization Guidlines. Die Seite ist sehr zu empfehelen, wenn es darum geht Programmcode zu optimieren. Einfach mal etwas drin rumlesen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:00 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