![]() |
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:
Nach dem Einlegen der CD (als nicht Admin) unter Windows Vista
...
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); ... (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? |
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)); |
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..." |
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?
|
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. |
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.
|
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Ein Doppelklick auf die Datei funktioniert (öffnet den IE).
|
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Das ist in der Tat merkwürdig. Ein "normales" ShellExecute geht auch nicht?
|
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. |
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Dann gehen mir im Moment leider die Ideen aus, sry :(
|
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Versuch es mal so:
Delphi-Quellcode:
Ansonsten, was steht denn in spath bzw. sFile?
...
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); ... |
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:
Also der Code versucht den Standardbrowser rauszubekommen, davon eine neue Instanz zu starten und dieser die URL mitzugeben.
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; 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 |
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Ginge das mit FindExecutable nicht etwas einfacher?
|
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Zitat:
![]() allerdings braucht man dazu eine passende Datei ![]() gut, wäre im aktuellen Beispiel zum Glück vorhandan ... also ja, geht mit ![]() nur im Falle meines Codes ... nein, da ja nur URL vorhanden ist und keine Datei :roll: |
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. |
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. |
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Du kannst eigentlich eine HTML-Seite in der Autorun.inf folgendermaßen starten:
Code:
So funktioniert das auf jeden Fall bei mir...
[AutoRun]
shellexecute=index.htm icon=iteration.ico |
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. |
Re: schellexecute von CD-Laufwerk funktioniert nicht immer
Dann wäre es interessant zu wissen, ob das Problem mit CreateProcess auch besteht.
|
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... ) |
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 20:20 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