2012-08-15 16 views
6

Forniamo video tutorial Flash che vengono installati sul disco rigido locale (Windows) con la nostra applicazione. La nostra app utilizza ShellExecute per aprire il file html (in qualunque browser sia associato ai file html) in cui sono incorporati.Rileva Chrome come browser associato ai file html in Windows

A quanto pare c'è un bug in Flash giocatori più recenti di Chrome che non riesce a riprodurre file locali (ma i file sul web vanno bene.)

(Francamente, sono stupito che questo bug non è stato riparato da Google. Sembra un grande per me ... ma forse non molte persone giocano a Flash da siti diversi dal web?)

C'è un work-around su about: schermata dei plugin in Chrome, ma possiamo chiedere ai nostri utenti di farlo Ecco una discussione sul work-around: http://techsmith.custhelp.com/app/answers/detail/a_id/3518

Desidero fornire ai miei utenti un'opzione per aprire i nostri file html IE. Se Chrome è il browser predefinito, visualizzerei una casella di controllo che dice qualcosa di imbarazzante come "Se i nostri video tutorial non vengono riprodotti, seleziona questa casella per provarli in IE".

Questo codice XE2 (di due anni fa su SO: link) è ancora ragionevole?

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 \ Open \ Command indica alla shell di Windows quale programma utilizzare per aprire i file HTML. Per vedere cosa l'utente utilizza per navigare in Internet, selezionare HKEY_CLASSES_ROOT \ .html. – cleong

+0

L'apertura di file HTML locali contenenti Flash è problematica in tutti e tre i principali browser. IE lancia un brutto messaggio di avviso. Firefox potrebbe bloccarsi se il file SWF fa qualcosa che attiva la finestra di avviso di sicurezza di Flash nel momento sbagliato. Roba da incubo. – cleong

+0

Non è un bug, è un buco di sicurezza, e lo hanno chiuso. –

risposta

4

Se si dispone di un vero e proprio percorso completo di un file esistente sul disco, è possibile utilizzare FindExecutable invece. È più semplice e non richiede l'accesso al registro, ma richiede che esista un file effettivo.

Ecco una console app per XE2 che illustra l'uso:

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. 

Il metodo si mostra funzionerà, ma FindExecutable è più facile (meno codice), e funziona su XP e sopra.

+0

Grazie, Ken! Inizialmente ero preoccupato per l'accesso al registro, ma pensavo che aprire le chiavi come ReadOnly sarebbe stato possibile per gli utenti non amministratori. Mi piace la tua soluzione migliore. Meno codice; minore dipendenza dall'implementazione interna di Windows delle associazioni di file. – RobertFrank

+0

@Robert: ho parlato dei problemi del registro. Il tuo codice funzionerebbe bene, ma è un po 'più complicato di "FindExecutable". (Ho controllato la memoria, e mi sono sbagliato riguardo a cosa significasse "KEY_EXECUTE" per i diritti.) Ho modificato per rimuovere quel paragrafo. –

Problemi correlati