Entwickler-Ecke

Windows API - winexec,shellexecute


fuggaz - Sa 13.09.08 18:54
Titel: winexec,shellexecute
Hallo,

folgendes Problem:
Ich will Launchy starten, aber anscheinend hat das so gar keine Lust dazu...
Ich kann jegliches Programm mittels winexec oder shellexecute starten aber launchy verweigert.
Ich habe mittels dem ProcessExplorer gesehen, dass Launchy gestartet wird aber sich sofort wieder schließt~~

Nach einigem rumspielen habe ich herausgefunden, dass ich aus dem gleichen Pfad, in dem auch Launchy liegt, es mit winexec ausführen kann. Aus einem anderen funktioniert es nicht.
Dann dachte ich mir schreib ich halt ein Programm, welches im Launchy-Pfad liegt und dies dann ausführt.
Dummerweise wird der aktuelle Pfad geändert, wenn ich es ausführe, damit meine ich:
Wenn ich es im Explorer ausführe ist der aktuelle Pfad: Z:\portableapps\launchy\
Da das Programm im selben Verzeichnis liegt brauche ich den Pfad nicht anzugeben.
Wenn ich es, ich habe es mal launch_launchy genannt, ausführe ist der aktuelle Pfad der von dem ausführenden Programm.
In meinem Fall Z:\
Tsja und das heißt, dass ich wieder aus einem anderen Pfad darauf zugreife und es wird nicht ausgeführt......

So sieht meine Zeile aus:


Delphi-Quelltext
1:
ShellExecute(Handle, nil, PChar('z:\portableapps\launchy\launchy.exe'), nilnil, SW_SHOW);                    


Für irgendwelche Vorschläge wäre ich dankbar.

mfg fuggaz

Moderiert von user profile iconNarses: Code- durch Delphi-Tags ersetzt


Timosch - Sa 13.09.08 19:18

1.) Verwende nie wieder WinExec. Das ist obsolet und wird jetzt schon von neueren Windows-Versionen z.T. nicht mehr unterstützt.
2.) Schau dir mal die Parameter von ShellExecute genau an. Da gibt es einen, mit dem man den Pfad angibt. Einer von den beiden, die du auf nil setzt.


fuggaz - Sa 13.09.08 19:24

1)ich mag winexec...das ist so schön einfach;-)
2)*thumbs up* das hatte ich ganz übersehen. Jetzt klappts. Danke :-)


Timosch - Sa 13.09.08 21:56

user profile iconfuggaz hat folgendes geschrieben:
1)ich mag winexec...das ist so schön einfach;-)
2)*thumbs up* das hatte ich ganz übersehen. Jetzt klappts. Danke :-)

Das WinExec so schön einfach ist, dachte ich auch mal. Habe das sogar mal hier im Forum geschrieben, aber jemand hat mich überzeugt (ist bestimmt schon drei Jahre her, ich finds nicht mehr), dass man es nicht verwenden sollte, weils bereits unter XP z.T. Probleme gibt. Ich bin also sozusagen der Ex-Alkoholiker, der von der Flasche weg ist, und du säufst noch. :mrgreen:
Wenn du oft ShellExecute verwendest, und du dir Arbeit beim Tippen sparen willst, schreib dir doch einen Wrapper:

Delphi-Quelltext
1:
2:
3:
4:
procedure ShellExecuteEasy(app:String;params:String);
begin
ShellExecute(handle,PChar('open'),PChar(ExtractFileName(app)),PChar(params),PChar(ExtractFilePath(app)),SW_SHOW);
end;


fuggaz - So 14.09.08 00:21

:-D:-D
xD
das ist ja mal eine Antwort^^

Ja ich denke, dass mit der extra procedure macht Sinn.
Auf die einfachsten Dingen zu kommen ist oft am schwersten;-)


Tilman - So 14.09.08 00:24

Ansonsten liefert Delphi auch immer noch ne FMXUtils.pas mit (Im Demo-Ordner) die folgenden Wrapper bereitstellt:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function ExecuteFile(const FileName, Params, DefaultDir: string;
  ShowCmd: Integer): THandle;
var
  zFileName, zParams, zDir: array[0..79of Char;
begin
  Result := ShellExecute(Application.MainForm.Handle, nil,
    StrPCopy(zFileName, FileName), StrPCopy(zParams, Params),
    StrPCopy(zDir, DefaultDir), ShowCmd);
end;


So dolle ist der allerdings auch nicht, aber er ist wenigstens etwas einfacher zu handeln, wenn man mit ShellExecute gar nicht klar kommt.


Delete - So 14.09.08 02:58

Der Rückgabewert THandle ist ja grausam. Das verleitet ja dazu, dass man denkt, dass Shellexecute irgendein Handle zurückliefert. Aber genau das tut es nicht: http://www.michael-puff.de/Artikel -> Shellexecute.shtml


Tilman - So 14.09.08 03:05

Sry, beschwer dich bei den Borländern, auf deren Mist ist es wohl einst gewachsen xD


Delete - So 14.09.08 03:35

Ich sehe gerade, das wird ja immer schlimmer:

Delphi-Quelltext
1:
zFileName, zParams, zDir: array[0..79of Char;                    

Der Code stammt wohl noch aus 16-Bit Windows Zeiten. Die maximale Pfadlänge ist doch irgendwas um die 260 Zeichen. Und die StrCopy Aufrufe, sind auch nicht das Gelbe vom Ei.


Tilman - So 14.09.08 03:47

Ja okay hätt ich lieber nicht posten sollen ;) (Hab aktuell D3,D7 und TD installiert, ist aber wohl in allen Versionen gleich. Das Zitat stammt aus dem TD-Ordner)