Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   ShellExecute Problem mit zweitem Parameter (https://www.delphipraxis.net/191364-shellexecute-problem-mit-zweitem-parameter.html)

markus5766h 7. Jan 2017 11:11

ShellExecute Problem mit zweitem Parameter
 
Moin zusammen.

Ich habe derzeit einige Probleme mit ShellExexcute :

1)
Code:
procedure TfrmMain.OpenMedia(Media: String);
var
  n : Integer;
  sFile : String;
  err : Integer;
begin
  err := 63;
  err := ShellExecute(Handle, 'open', PChar(Media), nil, nil, SW_SHOWNORMAL);
  if err <= 32  then ShowMessage(ShellExecuteErrMsg(err));
end;
obige Prozedur läuft ohne Probleme, Datei wird mit der dazugehörigen Anwendung geöffnet.

2)
Code:
procedure TfrmMain.OpenMediaWithApplication(Media, Application: String);
var
  n : Integer;
  sFile : String;
  err : Integer;
begin
  err := 63;
  err := ShellExecute(Handle, 'open', PChar(Application), PChar(Media), nil, SW_SHOWNORMAL);
  if err <= 32  then ShowMessage(ShellExecuteErrMsg(err));
  ShowMessage(IntToStr(err)); // <--- Rückgabewert ist 42
end;
Media :
M:\DB_MED\MediaFiles\Video\Incognito_JapanTour2012 .avi

übergebe ich die Anwendung, mit der die Datei (Media) geöffnet werden soll im ersten Parameter
und den Dateinamen im zweiten Parameter, bekomm' ich einen Rückgabewert von 42 (kein Fehler),
der Dateiname des zweiten Parameters scheint aber bei der Anwendung nicht anzukommen:
bsp. MediaPlayer oder VLC MediaPlayer --> beide können die Datei nicht öffnen, lt. Fehlermeldung
weist die Datei eine unbekannte Fehlermeldung auf (ist aber *.avi, mehrfach kontrolliert).
Media ist die gleiche Datei wie auch in der ersten Prozedur benutzt.

Weiß jemand Rat ?

BS : Win10 und Win7, beide 64Bit, gleiches Ergebnis.

juergen 7. Jan 2017 11:21

AW: ShellExecute Problem mit zweitem Parameter
 
Hallo,

ich hatte auch mal ein Problem mit ShellExexcute() wo bestimmte Dateien nicht aufgerufen wurden. Nachdem ich den Dateinamen in Anführungszeichen gesetzt hatte habe ich das Problem nicht mehr.
Delphi-Quellcode:
PChar('"' + Media + '"')
Ob das jetzt dein Problem löst vermag ich nicht zu sagen, da ich auch nicht weiß was genau sich hinter
Zitat:

Media
verbirgt.

markus5766h 7. Jan 2017 11:26

AW: ShellExecute Problem mit zweitem Parameter
 
@ juergen,

danke, das war's . . .
vielleicht weiß ja noch jemand den Hintergrund . . .

nahpets 7. Jan 2017 11:34

AW: ShellExecute Problem mit zweitem Parameter
 
Parameter werden durch Leerzeichen getrennt. Enthält ein Dateiname Leerzeichen, so wird er wie entsprechend viele Parameter behandelt.

Dateinamen mit Leerzeichen muss man in Hochkommata setzen. Das ist eigentlich der Fall, seit dem Windows bei Dateinamen mehr als 8.3 zulässt. (War das Windows 95 bzw. Windows NT?)

markus5766h 7. Jan 2017 11:46

AW: ShellExecute Problem mit zweitem Parameter
 
... daran hab' ich auch schon gedacht, und Leerzeichen durch Unterstriche ersetzt, das Ergebnis war allerdings das Gleiche,
und Unterstriche sind meines Wissens in Dateinamen erlaubt . . .

nahpets 7. Jan 2017 11:56

AW: ShellExecute Problem mit zweitem Parameter
 
Zeig' doch bitte mal den konkreten Inhalt von Media, so kann man doch nur spekulieren.

markus5766h 7. Jan 2017 12:02

AW: ShellExecute Problem mit zweitem Parameter
 
Media-Inhalt (ein Beispiel) im ersten Post

t.roller 7. Jan 2017 12:17

AW: ShellExecute Problem mit zweitem Parameter
 
In
M:\DB_MED\MediaFiles\Video\Incognito_JapanTour2012 .avi
ist ein SPACE vorhanden.

markus5766h 7. Jan 2017 12:27

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von t.roller (Beitrag 1358308)
In
M:\DB_MED\MediaFiles\Video\Incognito_JapanTour2012 .avi
ist ein SPACE vorhanden.

o.k., entdeckt, danke, dann erklärt sich das . . .

HolgerX 7. Jan 2017 14:04

AW: ShellExecute Problem mit zweitem Parameter
 
Hmm..

Zitat:

Zitat von markus5766h (Beitrag 1358296)
Moin zusammen.

Media :
M:\DB_MED\MediaFiles\Video\Incognito_JapanTour2012 .avi

Ist da zwischen 'JapanTour2012' und '.avi' ein Leerzeichen dazwischen?
Dann ist der Fehler gefunden... ;)

himitsu 7. Jan 2017 14:32

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von HolgerX (Beitrag 1358314)
Ist da zwischen 'JapanTour2012' und '.avi' ein Leerzeichen dazwischen?
Dann ist der Fehler gefunden... ;)

Nein, es ist kein Leerzeichen dazwischen.
Da hat nur das Forum zugeschlagen, welches zu lange "Wörter" trennt, damit ein Zeilenumbruch in die Anzeige rein kann. :zwinker:

HolgerX 7. Jan 2017 15:39

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von himitsu (Beitrag 1358316)
Zitat:

Zitat von HolgerX (Beitrag 1358314)
Ist da zwischen 'JapanTour2012' und '.avi' ein Leerzeichen dazwischen?
Dann ist der Fehler gefunden... ;)

Nein, es ist kein Leerzeichen dazwischen.
Da hat nur das Forum zugeschlagen, welches zu lange "Wörter" trennt, damit ein Zeilenumbruch in die Anzeige rein kann. :zwinker:


OK, nichts für ungut..

Nur Leerzeichen in Parameter sind ja Trennen für 'verschiedene' Parameter..

Deshalb geht es mit Anführungszeichen, da dann die Leerzeichen ein Teil 'eines' Parameters (eingeschlossen in den ") sind..

markus5766h 7. Jan 2017 19:03

AW: ShellExecute Problem mit zweitem Parameter
 
Ich hab's jetzt generell zwischen Anführungszeichen gesetzt,
löst erst mal das Problem.:)

himitsu 7. Jan 2017 19:14

AW: ShellExecute Problem mit zweitem Parameter
 
Das stimmt und dagegen hab ich auch nichts gesagt. :zwinker:

Nur da hier Mehrere auf dieses eine nichtexistente Leerzeichen eingingen, gedachte ich mal zu erwähnen, daß Dieses hier nur angezeigt wird, aber nicht im Namen vorkommt.
(das erkennt man gut, wenn man den Ursprungspost zitieren will)

markus5766h 7. Jan 2017 19:19

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von himitsu (Beitrag 1358351)
Das stimmt und dagegen hab ich auch nichts gesagt. :zwinker:

Nur da hier Mehrere auf dieses eine nichtexistente Leerzeichen eingingen, gedachte ich mal zu erwähnen, daß Dieses hier nur angezeigt wird, aber nicht im Namen vorkommt.
(das erkennt man gut, wenn man den Ursprungspost zitieren will)

Ich muss zugeben : hab' meine Ursprungsdatei nun nicht mehr geprüft, da ein Leerzeichen evt. auch in anderen Dateinamen
stecken könnte - daher habe ich es erst mal als Lösung genommen, inzwischen (zwei Stunden später) entferne ich diese
(und evt. andere unliebsame Zeichen) mittels StringReplace.
Ein ... PChar(Chr(34) + Media + Chr(34)) kann allerdings nicht schaden . . .:-D

t.roller 7. Jan 2017 19:43

AW: ShellExecute Problem mit zweitem Parameter
 
Zwei Funktionen zur Auswahl:
Delphi-Quellcode:
function RemoveSpaces(const s: string): string;
var
len, p: integer;
pc: PChar;
const
WhiteSpace = [#0, #9, #10, #13, #32];
begin
len := Length(s);
SetLength(Result, len);
pc := @s[1];
p := 0;
while len > 0 do
begin
if not (pc^ in WhiteSpace) then
begin
inc(p);
Result[p] := pc^;
end;
inc(pc);
dec(len);
end;
SetLength(Result, p);
end;

function DeleteSpaces(Str: string): string;
var i: Integer;
begin
i:=0;
while i<=Length(Str) do
if Str[i]=' ' then Delete(Str, i, 1)
else Inc(i);
Result:=Str;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Edit2.text:= RemoveSpaces(Edit1.text);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Edit2.text:= DeleteSpaces(Edit1.text);
end;

Dalai 7. Jan 2017 19:57

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von markus5766h (Beitrag 1358352)
Ein ... PChar(Chr(34) + Media + Chr(34)) kann allerdings nicht schaden . . .:-D

Ich biete
Delphi-Quellcode:
PChar(AnsiQuotedStr(Media, '"'))
. Finde ich besser lesbar, weil man nicht überlegen muss, was denn nun Chr(34) ist. Trotz des "Ansi" im Funktionsnamen eignet sich die Funktion für Unicode-Strings, wenn man die aus SysUtils verwendet - siehe Delphi-Referenz durchsuchenAnsiQuotedStr.

Grüße
Dalai

markus5766h 7. Jan 2017 20:06

AW: ShellExecute Problem mit zweitem Parameter
 
Zitat:

Zitat von t.roller (Beitrag 1358354)
Zwei Funktionen zur Auswahl:
...
[/delphi]

Code:
. . .
const
  OldString : Array[1..3] = (Chr(32), Chr(10), Chr(19));
  NewString : String = Chr(95);
var
  i : Byte;
  Destination : String;
. . .
  Destination := [irgendwas];
  for i := 1 to 3 do Destination := ReplaceString(Destination, OldString[i], NewString, [rfReplaceAll, rfIgnoreCase]);
. . .
finde ich persönlich kürzer und auch verständlich


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz