Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi schellexecute von CD-Laufwerk funktioniert nicht immer (https://www.delphipraxis.net/137850-schellexecute-von-cd-laufwerk-funktioniert-nicht-immer.html)

ringli 29. Jul 2009 17:59

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Versuch es mal so:
Delphi-Quellcode:
...
          with seInfo do
          begin
            cbSize := SizeOf(TShellExecuteInfo);
            fMask := SEE_MASK_NOCLOSEPROCESS;
            Wnd := 0;
            lpVerb := 'open';
            lpFile := NIL;
            lpParameters := pchar(spath+sFile);
            lpDirectory := pchar(sPath);
            nShow := SW_SHOWNORMAL;
          end; (*seInfo*)
          ShellExecuteEx(@seInfo);
...
Ansonsten, was steht denn in spath bzw. sFile?

himitsu 29. Jul 2009 18:12

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
hab seit Jahren dieses in Programmen

ist jetzt für Links im Programm vorgesehn (also für Labels welche wie ein Link dargestellt werden und wo im Hint die URL versteckt ist),

aber man kann ja auch einfach mal schnell TLabel(Sender).Hint durch irgendeinen String ersetzen.
Delphi-Quellcode:
Procedure TMainForm.Label11Click(Sender: TObject);
  Var S, S2: String;
    i: Integer;
    B: Boolean;

  Begin
    If Pos('mailto:', LowerCase(Trim(TLabel(Sender).Hint))) <> 1 Then Begin
      If not (RegQueryValue(HKEY_CLASSES_ROOT, '.html', nil, i) in [NO_ERROR, ERROR_MORE_DATA]) Then i := 0;
      SetLength(S, (i div SizeOf(Char)) - 1);
      If RegQueryValue(HKEY_CLASSES_ROOT, '.html', PChar(S), i) <> NO_ERROR Then S := '';
      S := S + '\shell\opennew\command';
      If not (RegQueryValue(HKEY_CLASSES_ROOT, PChar(S), nil, i) in [NO_ERROR, ERROR_MORE_DATA]) Then i := 0;
      SetLength(S2, (i div SizeOf(Char)) - 1);
      If RegQueryValue(HKEY_CLASSES_ROOT, PChar(S), PChar(S2), i) <> NO_ERROR Then S2 := '';
      If S2 = '' Then Begin
        Delete(S, Length(S) - 10, 3);
        If not (RegQueryValue(HKEY_CLASSES_ROOT, PChar(S), nil, i) in [NO_ERROR, ERROR_MORE_DATA]) Then i := 0;
        SetLength(S2, (i div SizeOf(Char)) - 1);
        If RegQueryValue(HKEY_CLASSES_ROOT, PChar(S), PChar(S2), i) <> NO_ERROR Then S2 := '';
      End;
      i := 1;
      B := False;
      While (i <= Length(S2)) and ((S2[i] <> ' ') or B) do Begin
        If S2[i] = '"' Then B := not B;
        Inc(i);
      End;
      S := Copy(S2, 1, i - 1);
      Delete(S2, 1, i);
      For i := Length(S) downto 1 do
        If S[i] = '"' Then Delete(S, i, 1);
      S := Trim(S);
      S2 := Trim(S2);
      If (S <> '') and (Pos('%1', S2) > 0) Then Begin
        S2 := StringReplace(S2, '%1', Trim(TLabel(Sender).Hint), []);
        If ShellExecute(Application.Handle, nil, PChar(S), PChar(S2), nil, SW_SHOWNORMAL) <= 32 Then S := '';
      End Else S := '';
    End Else S := '';
    If S = '' Then ShellExecute(Application.Handle, 'open', PChar(Trim(TLabel(Sender).Hint)), nil, nil, SW_SHOWNORMAL);
  End;
Also der Code versucht den Standardbrowser rauszubekommen, davon eine neue Instanz zu starten und dieser die URL mitzugeben.

Hauptgrund für den Umweg war mal, daß die URL in einem neuem Browserfenster gestartet werden sollte.
Wenn z.B. schon eine IE-Instanz geladen und der IE der Standardbrowser war, dann öffnete damals vorallem der IE die URL in diesem Fenster und die darin geöffnete Seite war "weg" ... mehrere Tabs gab's ja damals eh noch nicht und ich fand es voll nervig, wenn eine Webseite verschwand. :evil:

[edit]
hab grad gemerkt, daß es nicht D2009-tauglich was ... und hab schnell noch ein paar div SizeOf(Char) eingefügt

DeddyH 29. Jul 2009 18:15

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Ginge das mit FindExecutable nicht etwas einfacher?

himitsu 29. Jul 2009 18:26

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Zitat:

Zitat von DeddyH
Ginge das mit FindExecutable nicht etwas einfacher?

wie ich vor kurzem lernte, ja
MSDN-Library durchsuchenFindExecutable

allerdings braucht man dazu eine passende Datei
http://edn.embarcadero.com/article/26083

gut, wäre im aktuellen Beispiel zum Glück vorhandan ... also ja, geht mit MSDN-Library durchsuchenFindExecutable

nur im Falle meines Codes ... nein, da ja nur URL vorhanden ist und keine Datei :roll:

Magellan 30. Jul 2009 11:47

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Vielen Dank für die vielen Antworten.

Offensichtlich ist es nicht möglich, mit shellexecute oder shellexecuteEx von einer CD eine HTML-Seite im IE unter Vista zu öffnen.
Im MSDN habe ich herausgefunden, dass ein CD-Laufwerk unter Vista bezüglich der Rechtesteuerung und der Benutzerkonten anders gehandelt wird als normale Laufwerke.
Alle denkbaren Tests mit den o.g. Funktionen - auch eine Zertifizierung des Startprogramms - haben aber nichts gebracht.

Da mir der Aufwand einfach zu groß wird, mich in die Tiefen des IE und die Zugriffsrechte unter Vista einzuarbeiten nur um eine HTML Seite von einer CD zu öffnen nutze ich folgendes workaround:

Das Startprogramm erzeugt im Temp-Verzeichnis eine HTML-Seite, die sich im IE problemlos öffnet. Diese lädt dann die index.htm von der CD mit einem Refresh nach.

himitsu 30. Jul 2009 11:51

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Ginge es denn ohne Startprogramm?
Also die HTML direkt per Autostart zu laden, statt vorher erst dein Programm.

igel457 30. Jul 2009 12:19

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Du kannst eigentlich eine HTML-Seite in der Autorun.inf folgendermaßen starten:
Code:
[AutoRun]
shellexecute=index.htm
icon=iteration.ico
So funktioniert das auf jeden Fall bei mir...

Magellan 30. Jul 2009 12:21

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Ohne Startprogramm öffnet die HTML-Datei.

Ich brauche aber das Startprogramm um vorab z.B. nach installierten Programmen zu suchen oder ggf. die lokalen Flasheinstellungen zu ändern.

DeddyH 30. Jul 2009 12:40

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Dann wäre es interessant zu wissen, ob das Problem mit CreateProcess auch besteht.

RedShakal 3. Aug 2009 15:28

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
also das Problem was du da beschrieben hast haben viele, aber nicht nur bei IE sondern auch bei vielen Anderen Programmen. Ich habe mal versucht mit Shellexecute ein Spiel auf Knopfdruck zu öffnen, es ging 1 Sek auf und hat sich anschließend wieder geschlossen. Ich nehme an da ist ein Bug in der Funktion oder ein Parameter wurde falsch übergeben... Ich konnte das Problem bis heute leider auch nie lösen...
( Ist unter XP übrigens genauso bei mir auch mit Admin rechten... )


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:52 Uhr.
Seite 2 von 3     12 3      

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