AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) ShellExecute liefert ERROR_ACCESS_DENIED
Thema durchsuchen
Ansicht
Themen-Optionen

ShellExecute liefert ERROR_ACCESS_DENIED

Ein Thema von Amateurprofi · begonnen am 23. Dez 2017 · letzter Beitrag vom 17. Jan 2018
Antwort Antwort
Seite 1 von 3  1 23      
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#1

ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 02:31
Mit den unten stehenden Prozeduren will ich einen Beitrag aus Wikipedia anzeigen bzw. in GoogleMaps eine bestimmte Position.
Das funktioniert nur dann problemlos, wenn der Internet Explorer geöffnet ist.
Ist der IE nicht geöffnet gibt ShellExecute als Returncode 5 (ERROR_ACCESS_DENIED) zurück.
Weiß jemand was der Grund für dieses Verhalten, und ob und wie man das beheben kann.


Delphi-Quellcode:
type
   TGeoPos=packed Record
      Latitude:Extended;
      Longitude:Extended;
   end;

PROCEDURE ShowGoogleMaps(GP:TGeoPos);
var S,S1,S2:String;
begin
   S1:=Trim(FloatToStrF(GP.Latitude,ffFixed,6,6));
   S2:=Trim(FloatToStrF(-GP.Longitude,ffFixed,6,6));
   S:='http://maps.google.de/maps?q='+S1+','+S2+'&z=12';
   ShellExecute(0,'open',PWideChar(S),nil,nil,SW_SHOWNORMAL);
end;

PROCEDURE ShowWikipedia(const Term:String);
var S:String;
begin
   S:='https://de.wikipedia.org/wiki/'+Term;
   ShellExecute(0,'open',PWideChar(S),nil,nil,SW_SHOWNORMAL);
end;
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#2

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 02:57
Schau mal bitte hier: https://www.codeproject.com/Question...efault-browser

Das hieße: Statt SW_SHOWNORMAL bitte SW_SHOWDEFAULT nehmen.

Literatur dazu: https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.036 Beiträge
 
Delphi 12 Athens
 
#3

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 04:06
Zitat:
Ist der IE nicht geöffnet gibt ShellExecute als Returncode 5 (ERROR_ACCESS_DENIED) zurück.
Ich hoffe das hier ist nur ein Beispielcode und im Programm ist am Ende doch eine Fehlerbehandlung verbaut.


Extended: Diesen Typen sollte man besser nicht verwenden und ihn nur für interne Berechnungen benutzen.
Und ich glaub kaum, dass die Position auf der Erde im Mikrometerbereich wirklich notwendig ist.
Double (12 Nachkommastellen) oder gar Single (5 Nachkommastellen)

Aber das Wichtigste: Immer RICHTIGE Typen verwenden?

String > PChar > ShellExecute
ODER
WideString/UnicodeString > PWideChar > ShellExecuteW

Gut, ist kein wirklicher Fehler, aber wozu ist Trim da?
Da gibt es doch keine Ausführungszeichen.
Und statt der 3 Variablen und 3 Codezeilen hätte ich eher ein Delphi-Referenz durchsuchenFormat verwendet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Dez 2017 um 04:12 Uhr)
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#4

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 07:07
Schau mal bitte hier: https://www.codeproject.com/Question...efault-browser

Das hieße: Statt SW_SHOWNORMAL bitte SW_SHOWDEFAULT nehmen.

Literatur dazu: https://msdn.microsoft.com/de-de/lib...(v=vs.85).aspx
Vielen Dank!
Problem gelöst.
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.057 Beiträge
 
Delphi XE2 Professional
 
#5

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 08:10
Ich hoffe das hier ist nur ein Beispielcode und im Programm ist am Ende doch eine Fehlerbehandlung verbaut.
Da trügt deine Hoffnung. Ich merke in diesen Fällen auch ohne Fehlermeldung, wenn da etwas nicht funktioniert.

Extended: Diesen Typen sollte man besser nicht verwenden und ihn nur für interne Berechnungen benutzen.
Das mag sein dass "man" diesen Typ nicht benutzen sollte - aber ICH benutze ihn bevorzugt.

Und ich glaub kaum, dass die Position auf der Erde im Mikrometerbereich wirklich notwendig ist.
Double (12 Nachkommastellen) oder gar Single (5 Nachkommastellen)
Das ganze ist Bestandteil eines Programms das sich mit astronomischen Daten befasst und alle Daten als Extended führt, u.a. auch Koordinaten.

Aber das Wichtigste: Immer RICHTIGE Typen verwenden?
String > PChar > ShellExecute
ODER
WideString/UnicodeString > PWideChar > ShellExecuteW
Wenn ich bei ShellExecute(... den Cursor hinter die ( stelle und Ctrl-Space drücke, wird in der Parameterliste "Filename : PWideChar" gezeigt. Hat ja auch funktioniert. Habs aber jetzt mit PChar versucht - geht auch.

Gut, ist kein wirklicher Fehler, aber wozu ist Trim da?
Da gibt es doch keine Ausführungszeichen.
Das Trim soll führende Blanks entfernen. Ich vermute, dass ich früher die Floats mit einer Funktion in Strings gewandelt habe, die u.U. führende Blanks lieferte - kann ich heute nicht mehr nachvollziehen.

Und statt der 3 Variablen und 3 Codezeilen hätte ich eher ein Delphi-Referenz durchsuchenFormat verwendet.
Format ist mir zu kompliziert zu unübersichtlich zu ach alles mögliche. Hab ich nie benutzt und werde ich nie benutzen.

So, ich glaube ich bin auf alles eingegangen.
Nun erzähl mir mal, was das mit dem in #1 geschilderten Problem zu tun hatte?
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.036 Beiträge
 
Delphi 12 Athens
 
#6

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 11:01
Ja, bei dir ist "aktuell" PChar ein Alias für PWideChar und leider zeigt das CodeInsight den internen Typen an. (beim Compilieren wurde der Alias ersetzt)
Wenn du dir die Deklaration von ShellExecute ansiehst, siehst du den richtigen Typen.

In Bezug auf die WinAPI ist das Muster aber meistens recht leicht zu merken.
String > PChar > ShellExecute
AnsiString > PAnsiChar > ShellExecuteA
WideString/UnicodeString > PWideChar > ShellExecuteW

PS: Solches "Hat ja auch funktioniert" führte bei der Umstellung von ANSI zu Unicode zu problemen, da es danach plötzlich nicht mehr funktionierte. Das Selbe betrifft auch 32 und 64 Bit.
Hätte aber oft funktioniert, wenn die Typen wirklich gepasst hätten.

Vorallem Komplikationen beim Upgrade und für die Wiederverwendbarkeit der Codes, ist es immer Ratsam auf die Typen zu achten.
Meistens nimmt man den Typen der Eingangsparameter und wählt darauf die Casts und Funktionen,
oder ausgehend von der Funktion wird der Typ des Eingangsparameters ausgewählt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
419 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 14:58
Hallo Klaus (Amateurprofi), wie ruft Du ShowGoogleMaps auf? Ich wollte das Ganze mal ausprobieren mit einem Button und einem edit-Feld auf einer Form.
Die Geoposition wollte ich in das edit-Feld eintragen (welches Format haben diese?) und dann wollte ich per Button diese Pos. in GoogleMaps suchen lassen.
Irgendwie scheitere ich bei der Übergabe von (GP:TGeopos). Ich selle mich wohl zu blöd dazu an.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 15:53
Extended: Diesen Typen sollte man besser nicht verwenden und ihn nur für interne Berechnungen benutzen.
Das mag sein dass "man" diesen Typ nicht benutzen sollte - aber ICH benutze ihn bevorzugt.
Achtung. Die X86-64 FPU hat keine Unterstützung mehr für 80-Bit Floats (Extended). Entweder wird unter 64-Bit also emuliert, was fürchterlich langsam sein wird, oder deine Werte werden einfach truncated.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl (23. Dez 2017 um 15:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.036 Beiträge
 
Delphi 12 Athens
 
#9

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 16:01
Die Such-Syntax lautet
https://www.google.de/maps?q=suchbegriff&z=15

Er missbraucht das, da man auch nach Koordinaten suchen kann, anstatt sie anzugeben (zu beachten sind die Dezimaltrennzeichen in englischem Format)
http://maps.google.de/maps?q=51.0535283,13.7238866&z=15

Die korrekten URLs lauten z.B. wie folgt (mit @ wird die Angabe für Position und Zoom definiert)
https://www.google.de/maps/@51.0535283,13.7238866,15z
https://www.google.de/maps/search/suchbegriff/@51.0535283,13.7238866,15z
https://www.google.de/maps/place/Zwinger/@51.0535283,13.7238866,15z
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (23. Dez 2017 um 16:03 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: ShellExecute liefert ERROR_ACCESS_DENIED

  Alt 23. Dez 2017, 16:02
Eine Google-Maps-Urls sieht so aus:
Code:
https://www.google.de/maps/@53.5437308,9.9867191,15z
Allgemein:
Code:
http://maps.google.com/maps/@<lat>,<long>,<zoomfaktor>z
Delphi-Quellcode:
   sUrl := Format('https://www.google.de/maps/@%s,%s,%sz', [editLatitude.Text, editLongitude.Text, editZoomfaktor.Text]);
   ShellExecute(0,'open',PWideChar(sUrl),nil,nil,SW_SHOWDEFAULT);
Hierbei gilt: Der Dezimalseparator in den Editfeldern ist der Punkt.

Zuerst aus den Zeichenfolgen der Editfelder Extended zu machen, um die dann in ShowGoogleMaps wieder in Zeichenfolgen zu verwandeln, halte ich für übertrieben.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:37 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