Delphi-PRAXiS
Seite 1 von 2  1 2      

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

endeffects 28. Okt 2008 17:07


Problem mit Shellexecute
 
Hallo,

ich habe eine Problem mit dem Ausführen einer anderen Anwendung
mit Hilfe von Shellexecute. Die Anwendung kann wohl in verschiedenen
Modi gestartet werden, d.h. wenn man den Pfad zur Anwendung nicht richtig
übergibt startet anstelle ds Programmes das Setup. Leider gibt es auch keine
Parameter für die .exe die das unterdrücken würden.

Soweit ich das Verstanden habe wird über solche API aufrufe das Programm
dass man starten möchte irgendwie im Verzeichnis der eigenen Exe Datei ausgeführt.

Wenn ich nun also meine Exe Datei in das Programm Verzeichnis der Anwendung kopiere
und diese dann über Shellexecute aufrufe dann klappt das Alles problemlos.

Befindet sich meine Exe Datei aber in einer Überordner dann startet das Setup.

das funktioniert wenn sich beide Dateien im selben Verzeichnis befinden:
Delphi-Quellcode:
ShellExecute(0, 'open', PChar('fremde.exe'), nil, nil, SW_SHOWNORMAL)
und das klappt dann nicht, obwohl es das eigentlich sollte :(
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(ExtractFilePath(Application.ExeName) + 'Unterordner\fremde.exe'), nil, PChar(ExtractFilePath(Application.ExeName) +  'Unterordner\'), SW_SHOWNORMAL)
Jemand vielleicht eine Idee wie man das lösen kann?
Ich hab schon fast jede erdenkliche Kombination ausprobiert. =(

DeddyH 28. Okt 2008 17:31

Re: Problem mit Shellexecute
 
Was ist denn ein "Überordner"? Meinst Du das übergeordnete Verzeichnis Deines Programmpfads?

endeffects 28. Okt 2008 17:43

Re: Problem mit Shellexecute
 
oh :D also in dem fall ein übergeordnetes verzeichnis
der anwendung die ich starten will

DeddyH 28. Okt 2008 17:45

Re: Problem mit Shellexecute
 
Probier mal, ob das geht:
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(ExtractFilePath(Application.ExeName) + '..\Unterordner\fremde.exe'), nil, PChar(ExtractFilePath(Application.ExeName) +  '..\Unterordner\'), SW_SHOWNORMAL);

nahpets 28. Okt 2008 17:50

Re: Problem mit Shellexecute
 
Hallo,

versuch' mal per chdir vor dem Aufruf des Programmes in das Verzeichnis des aufzurufenden Programmes zu wechseln und nach dem Aufruf wieder per chdir zurück in das Verzeichnis des aufrufenden Programmes.

Sir Rufo 28. Okt 2008 19:28

Re: Problem mit Shellexecute
 
Hi,

so tut dat ...
Delphi-Quellcode:
procedure Test( const RunProg : string );
var
  Pfad : string;
  Prog : string;
begin
  Prog := RunProg;
  Pfad := ExtractFilePath( Prog );
  ShellExecute(
    0, 'open',
    PAnsiChar( Prog ), nil,
    PAnsiChar( Pfad ),
    SW_SHOWNORMAL );
end;
Warum geht dein Versuch nicht ...
Delphi-Quellcode:
PChar(ExtractFilePath(Application.ExeName))
soll einen Zeiger (Pointer) auf einen Speicherbereich bringen, wo sich ein nullterminierte Zeichenkette befindet.
Delphi-Quellcode:
ExtractFilePath(Application.ExeName)
ist aber nun mal sehr kurzlebig, weil ja nicht gesagt wird, dass das auch gespeichert werden soll.
Also alles zusammentragen und in einer Variablen speichern und dann mit PChar (bzw. die korrekte Deklaration ist ein PAnsiChar) den Zeiger auf die Variable holen und übergeben.
(bitte jetzt mal einen Pointer-Meister an die Front, bevor ich hier Müll erzähle, aber ich stelle mir das genau so vor)

cu

Oliver

endeffects 28. Okt 2008 19:40

Re: Problem mit Shellexecute
 
vielen Dank für die zahlreichen Antworten,
leider funktioniert das Alles nicht.

Ich habe wirkliche die verschiedensten Kombinationen ausprobiert.
Selbst die Pfade und Dateinamen habe ich direkt in Shellexecute
angegeben - also ohne irgendwelche Pointer oder andere Methoden
die sich negativ auswirken könnten.

Es ist einfach nicht zu wollen.

Was mir allerdings aufgefallen ist ist dass das unter Win XP
überhaupt kein Problem darstellt. Nur auf Win 2003 krieg ich
es einfach nicht zum laufen.

Sir Rufo 28. Okt 2008 19:47

Re: Problem mit Shellexecute
 
Hi,
Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

uses
  ShellApi;

{$R *.dfm}

procedure Test( const RunProg : string );
var
  Pfad : string;
  Prog : string;
begin
  Prog := RunProg;
  Pfad := ExtractFilePath( Prog );
  ShellExecute(
    0, 'open',
    PAnsiChar( Prog ), nil,
    PAnsiChar( Pfad ),
    SW_SHOWNORMAL );
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  Test( Application.ExeName );
end;

end.
Getestet (vor 1 Minute) auf Vista x64, Win2003, läuft

cu

Oliver

endeffects 28. Okt 2008 19:58

Re: Problem mit Shellexecute
 
nein leider startet auch weiterhin nur das setup,
es ist zum haare raufen!

evtl liegt es ja an der einfachen dateifrage die ich
unter xp benutze und der rechte verwaltung die win 2003 benutzt?

allerdigns hab ich auch schon probiert die anwendung samt ordner
für alle zugänglich zu machen =/

Sir Rufo 28. Okt 2008 20:13

Re: Problem mit Shellexecute
 
Hi,

ich glaube isch weiß jetzt ...

Delphi-Quellcode:
ShellExecute(
  hWnd, // Windows-Handle
  Operation,
  FileName,
  Parameters, // hier übergibst du nil, also nix, muss hier vielleicht der Pfad übergeben werden?
  Directory,
  ShowCmd )
Also so ( Button1 und Label1 auf das Form )
Delphi-Quellcode:
unit Unit3;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

uses
  ShellApi;

{$R *.dfm}

procedure Test( const RunProg : string );
var
  Pfad : string;
  Prog : string;
begin
  Prog := RunProg;
  Pfad := ExtractFilePath( Prog );
  ShellExecute(
    0, 'open',
    PAnsiChar( Prog ),
    PAnsiChar( Pfad ),
    PAnsiChar( Pfad ),
    SW_SHOWNORMAL );
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  Test( Application.ExeName );
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  if ParamCount > 0 then
    Label1.Caption := ParamStr( 1 );
end;

end.
Manchmal muss man mit mir sprechen wie mit einem Hund, nur etwas langsamer :mrgreen:

cu

Oliver


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:16 Uhr.
Seite 1 von 2  1 2      

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