2012-08-15 9 views
6

Proporcionamos videos tutoriales en Flash que se instalan en el disco duro local (Windows) con nuestra aplicación. Nuestra aplicación utiliza ShellExecute para abrir el archivo html (en cualquier navegador asociado a archivos html) en el que están integrados.Detecta Chrome como navegador asociado a archivos html en Windows

Al parecer hay un error en los reproductores de Flash más recientes de Chrome que no termina de jugar archivos locales (pero archivos a través de Internet están bien.)

(Francamente, estoy sorprendido de que este error no ha sido arreglado por Google. Parece una gran cosa para mí ... pero tal vez no muchas personas juegan Flash desde otras ubicaciones además de la web?)

Hay una solución alternativa en la pantalla acerca de: complementos en Chrome, pero podemos Les pedimos a nuestros usuarios que hagan eso. Aquí hay una discusión de la solución alternativa: http://techsmith.custhelp.com/app/answers/detail/a_id/3518

Quiero ofrecer a mis usuarios la opción de abrir nuestros archivos html IE. Si Chrome es su navegador predeterminado, mostraría una casilla que diga algo embarazoso como "Si nuestros videos tutoriales no se reproducen, marque esta casilla para probarlos en IE".

¿Sigue siendo razonable este código XE2 (desde hace dos años en SO: link)?

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 le dice al shell de Windows qué programa usar para abrir archivos HTML. Para ver lo que usa el usuario para navegar en Internet, verifique HKEY_CLASSES_ROOT \ .html. – cleong

+0

Abrir archivos HTML locales que contienen Flash es problemático en los tres principales navegadores. IE arroja un feo mensaje de advertencia. Firefox podría fallar si el SWF hace algo que activa la ventana de advertencia de seguridad de Flash en el momento incorrecto. Cosas de pesadilla. – cleong

+0

No es un error, es un agujero de seguridad, y lo cerraron. –

Respuesta

4

Si usted tiene una ruta completa real de un archivo existente en el disco, puede utilizar FindExecutable lugar. Es más fácil y no requiere acceso al registro, pero sí requiere que exista un archivo real.

Aquí es una aplicación de consola para XE2 que demuestra el 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. 

El método que muestran va a funcionar, pero FindExecutable es más fácil (menos código) y funciona en XP y superior.

+0

¡Gracias, Ken! Al principio estaba preocupado por el acceso al registro, pero pensé que abrir las claves como ReadOnly sería posible para usuarios que no sean administradores. Me gusta tu solución mejor. Menos código; menos dependencia de la implementación interna de Windows de asociaciones de archivos. – RobertFrank

+0

@Robert: me equivoqué sobre los problemas de registro. Su código funcionaría bien, pero es un poco más complicado que 'FindExecutable'. (Revisé mi memoria y me equivoqué acerca de qué significa exactamente 'KEY_EXECUTE' para los derechos.) Lo edité para eliminar ese párrafo. –

Cuestiones relacionadas