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 schellexecute von CD-Laufwerk funktioniert nicht immer (https://www.delphipraxis.net/137850-schellexecute-von-cd-laufwerk-funktioniert-nicht-immer.html)

Magellan 29. Jul 2009 16:23


schellexecute von CD-Laufwerk funktioniert nicht immer
 
Hallo,

eigentlich ist es eine einfache Aufgabe, eine Datei mit dem zugehörigen Programm zu öffnen.
Dafür gibts seit vielen Jahren shellexecute oder schellexecuteEx.

Das Problem:
Ein autostart Programm soll beim Einlegen einer CD eine HTML-Seite im Browser öffnen. Das sollte
mit schellexecute bzw. schellexecuteEx doch problemlos gehen. Geht es aber nicht.

Delphi-Quellcode:
  ...
          with seInfo do
          begin
            cbSize := SizeOf(TShellExecuteInfo);
            fMask := SEE_MASK_NOCLOSEPROCESS;
            Wnd := 0;
            lpVerb := 'open';
            lpFile := pchar(spath+sFile);
            lpParameters := NIL;
            lpDirectory := pchar(sPath);
            nShow := SW_SHOWNORMAL;
          end; (*seInfo*)
          ShellExecuteEx(@seInfo);
...
Nach dem Einlegen der CD (als nicht Admin) unter Windows Vista
(IE7 + IE8, jeweils mit Standard-Einstellungen) öffnet sich der "Automatische Wiedergabe-Dialog".
Führt man die Start.exe aus, poppt für den Bruchteil einer Sekunde ein leeres Browser-Fenster auf,
verschwinder darauf hin aber wieder in den Untiefen des Systems. Ist hingegen der IE schon gestartet,
dann öffnet sich nach dem Laden der CD ein neuer Tab mit dem gewünschten Inhalt.

Das Problem tritt nicht auf
- mit z.B. Firefox als Standardbrowser
- Wenn man als Admin angemeldet ist
- Wenn das autostart Programm von einer Festplatte gestartet wird
- unter XP

Hat jemand eine Idee?

DeddyH 29. Jul 2009 16:27

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Hallo und Willkommen in der DP :dp:,

ich würde zunächst Folgendes versuchen:
Delphi-Quellcode:
if not ShellExecuteEx(@seInfo) then
  ShowMessage(SysErrorMessage(GetLastError));

Magellan 29. Jul 2009 16:43

Re: shellexecute von CD-Laufwerk funktioniert nicht immer
 
Danke für die Antwort.

Hab ich probiert - keine Fehlermeldung. Auch shellexecute gibt keinen Fehler zurück (>32).

Der IE wird ja auch gestartet, aber er lädt die Datei nicht.
Es ist nur zu sehen "Verbindung wird hergestellt..."

DeddyH 29. Jul 2009 16:46

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Hast Du dieses Verhalten auch, wenn Du im Explorer zu der *.html navigierst und einen Doppelklick ausführst?

Magellan 29. Jul 2009 16:55

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Die HTML-Seite lässt sich im IE problemlos öffnen.

Es geht ja alles, wenn der IE bereits läuft oder das Programm von einer Festplatte oder von CD als Admin gestartet wird.

DeddyH 29. Jul 2009 17:00

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Moment, ich meinte jetzt nicht IE öffnen und zur Seite auf der CD wechseln. Ich meinte tatsächlich einen Doppelklick auf die Datei im Windows-Explorer.

Magellan 29. Jul 2009 17:05

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Ein Doppelklick auf die Datei funktioniert (öffnet den IE).

DeddyH 29. Jul 2009 17:08

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Das ist in der Tat merkwürdig. Ein "normales" ShellExecute geht auch nicht?

Magellan 29. Jul 2009 17:13

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Leider nein - das gleiche Verhalten...
Mit shellexecute hatte die autostart Programme für CDs bislang auch umgesetzt.

DeddyH 29. Jul 2009 17:43

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Dann gehen mir im Moment leider die Ideen aus, sry :(

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... )

Magellan 5. Aug 2009 08:32

Re: schellexecute von CD-Laufwerk funktioniert nicht immer
 
Nach vielen erfolglosen Tests auf verschiedenen Systemen grenzt sich der Bug ein wenig ein.
Scheinbar hängt das Verhalten auch mit der Hardware bzw. den installierten Treibern zusammen, da auf einigen Systemen nach einem Treiberupdate alles funktionierte.


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:35 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