Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Webseite im Standardbrowser laden (Probleme) (https://www.delphipraxis.net/20818-webseite-im-standardbrowser-laden-probleme.html)

himitsu 23. Apr 2004 17:57


Webseite im Standardbrowser laden (Probleme)
 
Ich weiß, es gibt schon zu viele Fragen dieser Art, aber dennoch hat mir nicht's richtig gehlfen.

Also ich möchte eine Webseite in einen neuen Fenster des Standardbrowsers laden, aber es geht nicht:

Das öffnet zwar die Seite, aber nur wenn schon ein Browserfenser vorhanden ist, sonst passiert nicht's
Delphi-Quellcode:
ShellExecute(0, 'open', 'http://www.xyz.de/index.php#pos', '', nil, SW_Show);
Ohne Angabe von #pos wird notfalls ein Fenster geöffnet (wenn noch keines offen ist), aber wenn schon eies da ist, dann wird auch hier die Seite in dem vorhandenemn geladen
Delphi-Quellcode:
ShellExecute(0, 'open', 'http://www.xyz.de/index.php', '', nil, SW_Show);
geht auch nicht - es heist dort "Zugriff verweigert", dabei bin ich als Admin angemeldet?
(das Programm/Verzeichnis wird aus der Registry geholt und dieser Pfad ist auch in Ordnung)
Delphi-Quellcode:
ShellExecute(0, 'open', PChar(Prog), 'http://...', nil, SW_Show);
Auch wenn es nicht mit WinExec hab ich es schon versucht.
Delphi-Quellcode:
WinExec('http://www.xyz.de/index.php#pos', SW_SHOW);
WinExec(PChar('"' + Prog + '" http://www.xyz.de/index.php#pos'), SW_SHOW);

mein derzeitiger Code, der eigentlich funktionieren sollte - zumindestens wird im Fehlerfall (der ja komischer Weise immer ist) die Seite dennoch geöffnet, wenn auch nicht dort, wo sie soll :( :
(da in der Registry '"K:\Programme\Internet Explorer\iexplore.exe" -nohome' steht, wird " und der Parameter noch entfernt)
Delphi-Quellcode:
Prog := '';
With TRegistry.Create(Key_Read) do
  Try
    RootKey := HKEY_CLASSES_ROOT;
    If OpenKey('http\shell\open\command', false) Then Begin
      Prog := Trim(ReadString(''));
      CloseKey;
    End;
  Finally
    Free;
  End;
If Pos('"', Prog) > 0 Then Begin
  If Prog[1] = '"' Then Delete(Prog, 1, 1);
  Prog := Trim(Copy(Prog, 1, Pos('"', Prog) - 1));
End Else
  If Pos(' ', Prog) > 0 Then Prog := Copy(Prog, 1, Pos(' ', Prog) - 1);
If (Prog = '') or (ShellExecute(0, 'open', PChar(Prog),
  'http://www.xyz.de/index.php#pos', nil, SW_Show) <> 0) Then
  If ShellExecute(0, 'open', 'http://www.xyz.de/index.php#pos', '', nil, SW_Show) <> 0 Then
    ShellExecute(0, 'open', 'http://www.xyz.de/index.php', '', nil, SW_Show);
Falls keinem was einfällt, dann wäre ich auch damit zufriden, wenn ich erfahr' wie man vor Programm aus einen Link in einem TWebBrowser anklicken kann, da zumindestens dieses mal ein WebBrowser mit im Programm ist.

Markus K. 23. Apr 2004 18:28

Re: Webseite im Standardbrowser laden (Probleme)
 
Hallo himitsu,
der folgende Code öffnet die Website immer in einem neuen Fenster...jedenfalls bei mir. Vielleicht hilft er dir weiter.
Delphi-Quellcode:
begin
     ShellExecute(0, 'Open',PChar('IEXPLORE.EXE'),'http://web.de', nil, SW_ShowNormal);
end;
Tschüß Markus

mirage228 23. Apr 2004 18:52

Re: Webseite im Standardbrowser laden (Probleme)
 
Zitat:

Zitat von Markus K.
Hallo himitsu,
der folgende Code öffnet die Website immer in einem neuen Fenster...jedenfalls bei mir. Vielleicht hilft er dir weiter.
Delphi-Quellcode:
begin
     ShellExecute(0, 'Open',PChar('IEXPLORE.EXE'),'http://web.de', nil, SW_ShowNormal);
end;
Tschüß Markus

Und wenn jemand nicht den Internet Explorer verwendet? :?:

mfG
mirage228

Nonsense 23. Apr 2004 19:10

Re: Webseite im Standardbrowser laden (Probleme)
 
http://www.google.com/search?q=regis...G=Google-Suche :wink:

Markus K. 23. Apr 2004 19:15

Re: Webseite im Standardbrowser laden (Probleme)
 
Hallo mirage228,
dann würde ich vorher noch den Standardbrowser ermitteln z.B.:
Delphi-Quellcode:
var
  StandardBrowser: String;
begin
  with TRegistry.Create do
    try
      rootkey := HKEY_CLASSES_ROOT;
      OpenKey('\htmlfile\shell\open\command', False);
      try
        StandardBrowser := ReadString('');
      except
        StandardBrowser := '';
      end;
      CloseKey;
    finally
      Free;
    end;
  if StandardBrowser = '' then Exit;
  StandardBrowser:= Copy(StandardBrowser, Pos('"', StandardBrowser) + 1, Length(StandardBrowser));
  StandardBrowser:= Copy(StandardBrowser, 1, Pos('"', StandardBrowser) - 1);
  ShellExecute(0, 'Open',PChar(StandardBrowser),'http://web.de', nil, SW_ShowNormal);
end;
Tschüß Markus

himitsu 23. Apr 2004 19:23

Re: Webseite im Standardbrowser laden (Probleme)
 
@Markus K.
wegen dem, was mirage228 schon sagte, wollte ich ja den IE nicht direkt angeben.

Und mein Code geht jetzt doch.

Hab mal meine FireWall zurückgesetzt - die hatte aus irgendeinem unerfindlichen Grund meinem Programm den direkten Zugiff auf "iexplorer.exe" verboten

Also: die FireWall war Schuld :wall: :wall: :wall:

MrKnogge 23. Apr 2004 19:39

Re: Webseite im Standardbrowser laden (Probleme)
 
Deine Firewall hat deinem Programm verboten mit der IExplorer.exe zu reden :shock:

Ich dachte die überwachen nur die Port's in die große weite Welt der Daten !?

himitsu 23. Apr 2004 19:57

Re: Webseite im Standardbrowser laden (Probleme)
 
Nee, nicht nur - ich hab 'ne FW von Kerio und die überwacht vieles.

z.B.
kann ich das Starten von noch nicht vreigegebenen/geänderten Dateien verhinden
oder programmen verbieten andere Programme zu starten
...

Allerding hatte ich meinem Proggi alles erlaubt :gruebel:
aber jetzt fällt mir gerade auf, der der TWebBrowser beim Start meines Programmes versucht den CTF Loader (ctfmon.exe) zu starten und diese hatte ich geblockt?
der CTF Loader ist doch meines Wissens eine "unwichtige" Datei vom MS Office-Packet???



Na ja, zumindestens weiß ich jetzt, das der Fehler nicht am Programm lag :)

himitsu 26. Apr 2004 11:07

Re: Webseite im Standardbrowser laden (Probleme)
 
So, es ist also doch noch nicht überstanden, zwar funktioniert der Aufruf super (so wie gewollt), aber es wird dennoch ein Fehlercode zurückgegeben, das den Ersatzaufruf ausführt - also es werden 2 Seiten geladen, wobei der Ersatzaufruf natürlich wieder ein geöffenetes Fensert überschreibt.

Leider hab ich keine Ahnung, was der Fehlercode 42 bedeutet.
Es schein auch keine Konstante dafür zu geben - hab schon Einiges durchgeschaut...
Delphi-Quellcode:
{ Windows - Define the severity codes }
  ERROR_FILE_NOT_FOUND = 2;
  ERROR_PATH_NOT_FOUND = 3;
  ...

{ ShellAPI - ShellExecute() and ShellExecuteEx() error codes }
  SE_ERR_FNF             = 2;      { file not found }
  SE_ERR_PNF             = 3;      { path not found }
  ...

{nirgends gibt es 'ne 42}
Wie man sieht, wird sobald ein Standardbrowser gefunden wurde, die Webseite über diesen geladen und bei einen Fehler wirds nochmal ohne eine Programmangabe versucht, aber da ja der Fehlercode 42 zurückgegeben wird, obwohl der 1. Aufruf funktioniert, wird ja die Seite doppelt geladen.
Delphi-Quellcode:
If (Prog = '') or (ShellExecute(0, 'open', PChar(Prog), 'http://...#Pos', nil, SW_Show) <> 0) Then
  ShellExecute(0, 'open', 'http://...', nil, nil, SW_Show);
Ich könnte zwar den 1. Aufruf bei 0 und 42 als Erfolgreich werten, aber das gefällt mir nicht so richtig, da ich ja nicht weiß, was die 42 ist.

SirThornberry 26. Apr 2004 11:56

Re: Webseite im Standardbrowser laden (Probleme)
 
bist du sicher das 42 ein fehlercode ist? in meiner Hilfe steht
Zitat:

If the function succeeds, the return value is the instance handle of the application that was run
[...]
If the function fails, the return value is an error value that is less than or equal to 32. The following table lists these error values
und 42 ist doch größer 32

himitsu 26. Apr 2004 12:02

Re: Webseite im Standardbrowser laden (Probleme)
 
Ich hab je keine Ahnung, denn bisher ist immer 0 zurückgegeben wurden, wenn solche Programme, wie der IE... aufgerufen wurden.
Nur eben nicht in diesem Fall und irgendwas muß die 42 ja bedeuten.

[EDIT]
Dann müßte es doch so gehn? (funktionieren tut es ja :))

Delphi-Quellcode:
If (Prog = '') or not (ShellExecute(...) in [1..32]) Then
  ShellExecute(...);
Das Ergebnis ist doch ein Byte (0..255 und anscheinend 1..32 = Fehler)?

Aber was 42 ist, würde mich dennoch mal interessieren.

SirThornberry 26. Apr 2004 12:25

Re: Webseite im Standardbrowser laden (Probleme)
 
Na hab ich doch geschrieben was 42 bedeutet
Zitat:

If the function succeeds, the return value is the instance handle of the application that was run
und dann sollte es wohl nicht so
Delphi-Quellcode:
If (Prog = '') or not (ShellExecute(...) in [1..32]) Then
sondern so
Delphi-Quellcode:
If (Prog = '') or not (ShellExecute(...) in [0..32]) Then
aussehen

himitsu 26. Apr 2004 16:56

Re: Webseite im Standardbrowser laden (Probleme)
 
Das könnte hinkommen, den Wert 0 schein es in SE_ERR_... nicht zu geben, also würde es wohl beides funktionieren.

Ich hatte die 0 nur deswegen weggelassen:
Delphi-Quellcode:
{ Define the severity codes }
ERROR_SUCCESS = 0; { The operation completed successfully. }
NO_ERROR = 0;      { No dderror }
Ich hab es jetzt so gemacht:
Delphi-Quellcode:
If (Prog = '') or (ShellExecute(..) <= SE_ERR_DLLNOTFOUND) Then
  ShellExecute(...);

{ SE_ERR_DLLNOTFOUND = 32 }

SirThornberry 26. Apr 2004 16:59

Re: Webseite im Standardbrowser laden (Probleme)
 
ich habs genauso nur halt direkt und nicht als konstante. Das mit der 0 = success habsch gar ni gelsen :roll:

Christian Seehase 26. Apr 2004 21:13

Re: Webseite im Standardbrowser laden (Probleme)
 
Moin SirThornberry,

Zitat:

Zitat von SirThornberry
If the function succeeds, the return value is the instance handle of the application that was run

aus welcher Hilfe hast Du das denn?

ShellExecute gibt kein Instance Handle zurück.
Aus Gründen der Kompatibiliät mit 16 Bit Windows Programmen wurde der Rückgabewert von ShellExecute als Typ HINSTANCE deklariert, gibt aber tatsächlich kein entsprechendes Handle zurück.
Wichtig ist, ob der Rückgabewert > 32 ist (= Kein Fehler aufgetreten), oder nicht.

Zitat:

Zitat von PSDK
The only thing that can be done with the returned HINSTANCE is to cast it to an int and compare it with the value 32 or one of the error codes below.

Wobei ich zugeben muss, dass ich die Dokumentation des Rückgabewertes 0 (=> "The operating system is out of memory or resources.") doch mal stark anzweifeln möchte.

SirThornberry 26. Apr 2004 21:14

Re: Webseite im Standardbrowser laden (Probleme)
 
Stand so in der der Hilfe von D7Enterprise (Win32 Programmer's Reference)

Christian Seehase 26. Apr 2004 21:26

Re: Webseite im Standardbrowser laden (Probleme)
 
Moin SirThornberry,

dann scheint sich das was Borland hier mitliefert ja seit D5 nicht gebessert zu haben.
Ich denke mal, dass Du mit dem PSDK, dass Du bei MS herunterladen kannst wohl deutlich besser bedient sein wirst, obwohl das immer noch die Version Februar 2003 ist (gemäss Downloadseite).

SirThornberry 26. Apr 2004 22:27

Re: Webseite im Standardbrowser laden (Probleme)
 
ich hab mir das psdk mal runtergeladen, aber mit dem setup/install binsch ni zurecht gekommen

Luckie 27. Apr 2004 01:19

Re: Webseite im Standardbrowser laden (Probleme)
 
Zitat:

Zitat von SirThornberry
ich hab mir das psdk mal runtergeladen, aber mit dem setup/install binsch ni zurecht gekommen

Neue Frage, neuer Thread bitte.

@Christina: Warum sollten es auch eine aktuellere Version geben? SP2 für XP ist noch nicht raus und seit Februar 2003 hat sich nichts getan. ;)


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

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