2012-08-15 7 views
6

Wir bieten Flash-Tutorial Videos, die auf der lokalen (Windows) Festplatte mit unserer Anwendung installieren. Unsere Anwendung verwendet ShellExecute, um die HTML-Datei (in welchem ​​Browser auch immer HTML-Dateien zugeordnet sind) zu öffnen, in die sie eingebettet sind.Erkennen Chrome als Browser mit HTML-Dateien in Windows assoziiert

Anscheinend gibt es einen Fehler in Chrome neueren Flash-Player, die lokale Dateien (aber Dateien über das Internet sind in Ordnung.)

(Ehrlich gesagt spielen nicht, ich bin erstaunt, dass dieser Fehler nicht gewesen Scheint wie ein großer für mich ... aber vielleicht nicht viele Leute spielen Flash von Orten außer dem Web?)

Es gibt eine Work-Around auf dem Bildschirm about: plugins in Chrome, aber wir können Fragen Sie unsere Benutzer nicht danach. Hier ist eine Diskussion über die Problemumgehung: http://techsmith.custhelp.com/app/answers/detail/a_id/3518

Ich möchte meinen Benutzern eine Option zum Öffnen unserer HTML-Dateien IE zur Verfügung stellen. Wenn Chrome ihr Standardbrowser ist, dann würde ich ein Kontrollkästchen anzeigen, das etwas peinliches wie "Wenn unsere Tutorialvideos nicht abgespielt werden können, aktivieren Sie dieses Kontrollkästchen, um sie im IE zu testen."

Ist dieser XE2-Code (vor zwei Jahren auf SO: link) immer noch sinnvoll?

if pos('CHROME', UpperCase(GetAssociation('C:\Path\File.html')) > 0 then 
    // Chrome is the default browser 

function GetAssociation(const DocFileName: string): string; 
var 
    FileClass: string; 
    Reg: TRegistry; 
begin 
    Result := ''; 
    Reg := TRegistry.Create(KEY_EXECUTE); 
    Reg.RootKey := HKEY_CLASSES_ROOT; 
    FileClass := ''; 
    if Reg.OpenKeyReadOnly(ExtractFileExt(DocFileName)) then 
    begin 
    FileClass := Reg.ReadString(''); 
    Reg.CloseKey; 
    end; 
    if FileClass <> '' then begin 
    if Reg.OpenKeyReadOnly(FileClass + '\Shell\Open\Command') then 
    begin 
     Result := Reg.ReadString(''); 
     Reg.CloseKey; 
    end; 
    end; 
    Reg.Free; 
end; 
+0

HKEY_CLASSES_ROOT \ Shell \ Öffnen \ Befehl teilt der Windows-Shell mit, welches Programm zum Öffnen von HTML-Dateien verwendet wird. Um zu sehen, was der Benutzer zum Durchsuchen des Internets verwendet, überprüfen Sie HKEY_CLASSES_ROOT \ .html. – cleong

+0

Das Öffnen lokaler HTML-Dateien, die Flash enthalten, ist in allen drei gängigen Browsern problematisch. IE wirft eine hässliche Warnmeldung auf. Firefox könnte abstürzen, wenn die SWF etwas tut, das das Sicherheitswarnfenster von Flash im falschen Moment auslöst. Zeug des Alptraums. – cleong

+0

Es ist kein Fehler, es ist ein Sicherheitsloch, und sie haben es geschlossen. –

Antwort

4

Wenn Sie einen tatsächlichen vollständigen Pfad zu einer vorhandenen Datei auf der Festplatte haben, können Sie FindExecutable stattdessen verwenden. Es ist einfacher und erfordert keinen Zugriff auf die Registrierung, aber es muss eine tatsächliche Datei vorhanden sein.

Hier ist eine Konsolenanwendung für XE2 die Verwendung demonstriert:

program Project1; 

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, ShellAPI, Windows; 

var 
    Buffer: array[0..MAX_PATH] of Char; 
    Res: Integer; 

begin 
    FillChar(Buffer, SizeOf(Buffer), #0); 
    Res := FindExecutable(PChar('C:\Path\File.html'), nil, Buffer); 
    if Res > 32 then 
    Writeln('Executable is ' + Buffer) 
    else 
    WriteLn(SysErrorMessage(Res)); 
    Readln; 
end. 

Die Methode funktioniert zeigen, aber FindExecutable ist einfacher (weniger Code) und arbeitet unter Windows XP und höher.

+0

Danke, Ken! Ich war anfangs besorgt über Registrierungszugriff, dachte aber, dass das Öffnen der Schlüssel als ReadOnly für Nicht-Admin-Benutzer möglich wäre. Ich mag deine Lösung besser. Weniger Code; weniger Abhängigkeit von Windows-internen Implementierung von Dateizuordnungen. – RobertFrank

+0

@Robert: Ich habe über die Registry-Probleme falsch verstanden. Ihr Code würde gut funktionieren, ist aber ein wenig komplizierter als 'FindExecutable'. (Ich überprüfte mein Gedächtnis und irrte mich genau, was 'KEY_EXECUTE' für Rechte bedeutete.) Ich editierte, um diesen Absatz zu entfernen. –

Verwandte Themen