Autor Beitrag
AXMD
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Sa 09.08.03 13:36 
Hi,

ich habe folgendes Problem: ich starte aus meinem Installationsprogramm heraus die Datei "dstp.exe" via ShellExecute. Wenn ich nun im Programm "dstp.exe" einen Menüpunkt anklicke, der nichts anderes macht als "skinedit.exe" über ShellExecute zu starten, dann tut sich nichts - absolut nichts.
Das Seltsame: starte ich "dstp.exe" normal, funktionieren die Aufrufe korrekt.
Weiß jemand, was da nicht in Ordnung ist?

AXMD

PS.: Hab mal versucht WinExec zu verwenden - kein Unterschied
PhilGo
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 315

Win 98, Win Longhorn ;-)

BeitragVerfasst: Sa 09.08.03 13:49 
Versuch doch mal "skinedit.exe" mit Winexec aufzurufen.
So z.B.:
ausblenden Delphi-Quelltext
1:
WinExec(PChar('skinedit.exe'), SW_NORMAL);					


Vieleicht klappt das ja.

_________________
Sie werden dich finden und töten... Söhne der großen Bärin!
Popov
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 1655
Erhaltene Danke: 13

WinXP Prof.
Bei Kleinigkeiten D3Pro, bei größeren Sachen D6Pro oder D7
BeitragVerfasst: Sa 09.08.03 14:17 
Versuch bitte kein WinExec. WinExec ist veraltet und ist nur noch in der API, damit ältere Programme funktionieren. Eines Tages ist der Befehl weg und dein Aufruf funktioniert nicht mehr.

Zu deinem Problem. Hast du auch den Pfad zu dem Programm genannt oder hast du einfach nur den Namen des Programms genannt. Wenn das Programm nicht zufällig unter C: oder C:\Windows liegt, dann findet ShellExecute das Programm nicht. Eine Fehlermeldung gibt es nicht, nur Rückgabewert.

_________________
Popov
BungeeBug
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 901



BeitragVerfasst: Sa 09.08.03 14:38 
Hi,

du hast an die ShellApi gedacht?

Guck mal nach ob die eingebunden ist!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Sa 09.08.03 17:20 
Ich schließe mich mal Popov an. AXMD hat nicht geschrieben, dass er eine Fehlermeldung sieht, die darauf hindeutet, dass ShellExecute unbekannt ist. Er schrieb:
Zitat:
Wenn ich nun im Programm "dstp.exe" einen Menüpunkt anklicke, der nichts anderes macht als "skinedit.exe" über ShellExecute zu starten, dann tut sich nichts - absolut nichts.
frank2269
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 26.08.03 14:04 
Hallo AXMD,

ich hatte mal das selbe Problem wie du.

Gelöst hatte ich es so ...
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
shellexecute (
    application.handle,pchar ('open'),
    pchar ('EXENAME'), 
    pchar ('PARAMETER'),
    pchar (' Pfad wo die Ausführbare Date "EXENAME steht"  '),
    SW_MAXIMIZE
  );

Übergib nicht nur die EXENAME sondern auch den Pfad der EXENAME siehe oben.

Gruß
Frank

Moderiert von user profile iconTino: Delphi-Tags hinzugefügt & Size-Tag entfernt.
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 26.08.03 14:51 
Entschuldige, aber das ist Quatsch. Der Parameter, den du da so riesig darstellst, verweist nur auf das Arbeitsverzeichnis, in dem das zu startende Programm aktiv werden soll. Mit dem Ordner, in dem sich die Exe befindet, muss das nichts zu tun haben.

Da ist der dritte Parameter von ShellExecute (= das Programm, das du starten möchtest) wichtiger. Hier solltest du den Pfad mit angeben. Wenn der Pfad aber in der Umgebungsvariablen %PATH% steht, kannst du darauf auch verzichten (s. Beispiel).

Würde deine Logik stimmen, dann dürfte die Delphi-Verknüpfung in deinem Startmenü nicht funktionieren. Dort verweist nämlich das Arbeitsverzeichnis auf den Ordner mit den Projektdateien (übrigens ein Tipp, wie man einen anderen Ordner als den Projekt-Ordner von Borland nutzen kann), aber nicht auf den Ordner, in dem sich die "delphi32.exe" befindet. Oder der Test mit ShellExecute:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
ShellExecute(self.Handle,
  'open',
  'delphi32.exe',
  '/ns',
  'e:\DelphiSources',
  SW_SHOWNORMAL);

Gruß.
AXMD Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 4006
Erhaltene Danke: 7

Windows 10 64 bit
C# (Visual Studio 2019 Express)
BeitragVerfasst: Di 26.08.03 15:47 
Hi,

ich übergebe den ganzen Pfad - genauso wie MathiasSimmack es in seinem Post schreibt - trotzdem hauts nicht hin...

AXMD
frank2269
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Di 26.08.03 17:16 
Hallo MathiasSimmack,

ich hatte das selbe Problem und bei mir funktioniert aber nur diese eine Einstellung.

HINSTANCE ShellExecute(

HWND hwnd, // handle to parent window
LPCTSTR lpOperation, // pointer to string that specifies operation to perform
LPCTSTR lpFile, // pointer to filename or folder name string
LPCTSTR lpParameters, // pointer to string that specifies executable-file parameters
LPCTSTR lpDirectory, // pointer to string that specifies default directory
INT nShowCmd // whether file is shown when opened
);


Denn wenn man nicht lpDirectory angiebt dann ist der Default Ordner der von wo aus man das Prog. getsartet hatt.

Und wenn dann meine Anwendung nach Datei(en) suchte konnte die Anwendung diese nie finden und Beendete sich ohne Fehlermeldung.

Bei meiner Anwendung hatte sich dann der og. Fehler erledigt.

Und im übrigen ist bestimmt nicht alles Quatsch, jeder versucht doch nur zu helfen ob Richtig oder Falsch denn man lernt ja nie aus oder.

ps. mit dem Groß anmarkieren war nur ein Fehler bei der Eingabe.

Gruß
Frank
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 26.08.03 17:58 
Dann ist die Anwendung schlecht programmiert und nutzt fälschlicherweise die Funktion GetCurrentDirectory, um ihr Programmverzeichnis zu ermittlen.
frank2269
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 27.08.03 08:55 
Hallo,

Ich habe Dir mal eine Kleine Procedure geschrieben, wo auch einige Fehler abgefangen werden, vielleicht hilft Sie dir weiter.

ausblenden volle Höhe 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:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
Procedure ExecuteFile(Filename:String;Parameter:String;Workpath:String;ErrorMessage:Boolean);
Var Xerror:Integer;
Begin
Trim(filename);
Trim(Parameter);
Trim(Workpath);

Xerror:=shellexecute(application.handle,Pchar('Open'),pchar(filename),pchar(parameter),pchar(Workpath),SW_RESTORE);

if ErrorMessage then
Begin
if length(filename)=0 then MessageDlg('Quelldatei konnte nicht gefunden werden !', mterror,[mbOk], 0);

if Xerror=ERROR_FILE_NOT_FOUND or SE_ERR_FNF then MessageDlg('Quelldatei konnte nicht gefunden werden !'+#13+#13+Filename, mterror,[mbOk], 0);

//if Xerror=SE_ERR_FNF then MessageDlg('Quelldatei konnte nicht gefunden werden !', mterror,[mbOk], 0);

if Xerror=SE_ERR_PNF then MessageDlg('Quellorder konnte nicht gefunden werden !', mterror,[mbOk], 0);

if Xerror=SE_ERR_ACCESSDENIED then MessageDlg('Der zugriff auf die Quelldatei wurde Verweigert !', mterror,[mbOk], 0);

if Xerror=SE_ERR_OOM then MessageDlg('Nicht genügend freier Arbeitsspeicher verfügbar !', mterror,[mbOk], 0);

if Xerror=SE_ERR_DLLNOTFOUND then MessageDlg('Eine DLL (Dynamik Linklibary), welche zur Ausführung benötigt wird, konnte nicht gefunden werden !', mterror,[mbOk], 0);


if Xerror=ERROR_BAD_FORMAT then MessageDlg('Ihre Quelldatei wird Nicht von Windows XX.xx Unterstützt ! ', mterror,[mbOk], 0);

if Xerror=SE_ERR_NOASSOC then
begin
if MessageDlg('Ihre Quelldatei konnte keiner Zielanwendung zugeordnet werden ! '+#13+'Möchten Sie nun Ihre Quelldatei mit einer Zielanwendung Öffnen ?', mterror,[mbyes,mbno], 0)=mryes then
begin
shellexecute(application.handle,pchar('open'),pchar('rundll32.exe'),pchar('shell32.dll,OpenAs_RunDLL '+filename),pchar(''),1);
end;
end;
end;
end;


Gruß
Frank