Entwickler-Ecke

Windows API - ShellExecute


Sylvus - Di 31.03.09 18:05
Titel: ShellExecute
Hay Leute, kleines Problem...
Ich will in meinem Programm ein beliebiges Dokument aufrufen, dessen Pfad der User selbst vorgibt, also z.B.:

D:\Programme\BlenderPortable2.46\meinDokument.odt

Ich weiß jedoch nicht, welches Dateiformat (doc,odt,txt..) die Datei hat, aber ich will ja auch das Windows die mit dem Standart Programm öffnet! Jetzt lautet meine Frage wie ich das anstelle :)
Also:


Delphi-Quelltext
1:
2:
3:
4:
5:
var 
tempname : string = 'D:\Programme\BlenderPortable2.46\meinDokument.odt';
begin
ShellExecute(Handle,nil,???,nil,tempname,SW_SHOW);
end;


Wäre nett wenn jemand die ??? ergänzen könnte, oder einfach den richtigen Befehl posten könnte :)
Dankeschön!!
Viele Grüße
Sylvus


jaenicke - Di 31.03.09 18:10

Du musst das auf PChar casten, und der zweite Parameter ist 'open':

Delphi-Quelltext
1:
ShellExecute(Handle, 'open', PChar(tempname), ...);                    


Sylvus - Di 31.03.09 18:14

Herzlichen Dank, funktioniert super!
Nur werd ich nicht ganz aus der Hilfe schlau, also wenn ich versuche zu verstehen was ich gemacht habe^^
Ich wandle ja den string in ein PChar um, dabei besteht ein PChar aus verschiedenen Teilen? Oder ist ein PChar nur ein pointer, der immer ein Zeichen weiter wandert?
Viele Grüße
Sylvus

und nochmal dankeschön für die schnelle Antwort!


jaenicke - Di 31.03.09 18:16

PChar ist ein Pointer auf eine nullterminierte Zeichenkette. Du musst bei einer solchen Zeichenkette nach dem Nullzeichen suchen um die Länge der Zeichenkette zu ermitteln.
Im Gegensatz dazu steht vor der eigentlichen Zeichenkette beim Datentyp String in Delphi eine Information über die Länge der Zeichenkette und ein Referenzzähler.


Sylvus - Di 31.03.09 18:33

ahhh gut haben wir das auch geklärt, noch ne kurze Frage, dann ist alles geklärt :)
ich hab jetzt


Delphi-Quelltext
1:
2:
3:
4:
try ShellExecute(...)
except
ShowMessage(...)
end;


aber er zeigt mir die Nachricht nicht an, auch wenn er keine Datei öffnen kann, weil die Datei nicht existiert!
Kann ich das irgendwie anders abfangen? Also prüfen ob er die Datei auch öffnet?

Vielen Dank
Sylvus


JayEff - Di 31.03.09 18:39

Shellexecute wirft keine Exceptions sondern gibt einen Fehlercode zurück, siehe
Zitat:
Suche im MSDN SHELLEXECUTE: Return Value

If the function succeeds, it returns a value greater than 32. If the function fails, it returns an error value that indicates the cause of the failure.[...]
Dort gibt's ne liste, was die Fehler-Zahlen bedeuten, aber für dich reicht einfach:

Delphi-Quelltext
1:
if Shellexecute(...) > 32 then Erfolg else Fehler                    


Edit: Autsch - Ich glaub das war ein Known-Bug.


jaenicke - Di 31.03.09 18:39

Wie wäre es mit dem Rückgabewert von ShellExecute?
// EDIT: :oops: ja, ShellExecute^^


Sylvus - Di 31.03.09 19:03

RückgabeWert von ShowMessage verstehe ich nicht, aber das andere funktioniert wunderbar!
Ich werd jetzt mal versuchen meine alte Delphi-Hilfe zu aktualisieren, damit ich mir das auch selbst erarbeiten kann!
Vielen Dank für die schnellen Antworten!
bye bye
Sylvus


JayEff - Di 31.03.09 19:09

user profile iconSylvus hat folgendes geschrieben Zum zitierten Posting springen:
RückgabeWert von ShowMessage verstehe ich nicht, aber das andere funktioniert wunderbar!
Er meinte auch den Rückgabewert von Shellexecute, Showmessage ist eine Prozedur und hat keinen :mrgreen:

Shellexecute steht so leider nicht in der Hilfe drin, API-Funktionen findet man aber immer auf msdn, siehe der Link in meinem Zitat :zustimm:

Edit: Die MSDN-Suche vom Delphi-Forum scheint nicht zu funktionieren, hier ein direkter Link :motz:
http://msdn.microsoft.com/en-us/library/bb762153(VS.85).aspx


Sylvus - Di 31.03.09 19:14

aaachso ok alles klar - Problem gelöst! Danke nochmal an alle :)