2012-08-15 12 views
6

私たちは、ローカルの(Windows)ハードディスクにインストールするFlashチュートリアルビデオをアプリケーションとともに提供しています。私たちのアプリは、ShellExecuteを使って、埋め込まれているHTMLファイル(htmlファイルに関連付けられているブラウザであれば)を開きます。Windowsのhtmlファイルに関連付けられたブラウザとしてChromeを検出する

どうやらローカルファイルを再生するために失敗したChromeのより最近のFlashプレーヤーのバグがあります(ただし、Web上のファイルが細かいですが。)

(率直に言って、私はこのバグがされていないことを驚いていますGoogle以外の場所からFlashをプレイしている人はほとんどいませんか?)

Chromeのabout:プラグイン画面については回避策がありますが、ユーザーにそれを依頼してはいけません。回避策の説明は次のとおりです。http://techsmith.custhelp.com/app/answers/detail/a_id/3518

私はhtmlファイルIEを開くオプションをユーザーに提供したいと考えています。 Chromeがデフォルトブラウザの場合は、「私たちのチュートリアル動画が再生できない場合は、このチェックボックスをオンにするとIEで試してみてください」のような恥ずかしいメッセージが表示されます。

このXE2コード(2年前の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は、HTMLファイルを開くために使用するプログラムをWindowsシェルに指示します。ユーザーがインターネットのブラウズに使用するものを確認するには、HKEY_CLASSES_ROOT \ .htmlをチェックします。 – cleong

+0

Flashを含むローカルHTMLファイルを開くことは、主要な3つのブラウザすべてで面倒です。 IEは醜い警告メッセージをスローします。 SWFが間違った瞬間にFlashのセキュリティ警告ウィンドウをトリガーするようなことをすると、Firefoxがクラッシュする可能性があります。悪夢のもの。 – cleong

+0

これはバグではなく、セキュリティホールです。彼らはそれを閉じました。 –

答えて

4

ディスク上の既存のファイルへのフルパスがある場合は、代わりにFindExecutableを使用できます。簡単ですし、レジストリへのアクセスは必要ありませんが、実際のファイルが存在する必要があります。あなたが表示さメソッドが動作します

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. 

が、FindExecutableが容易である(以下コード)とXP上と上に動作します:ここで

は、使用方法を示しXE2のコンソールアプリです。

+0

ありがとう、ケン!私は当初、レジストリアクセスについて心配していましたが、ReadOnlyとしてキーを開くことは管理者以外のユーザーにとって可能であると考えました。私はあなたのソリューションがより好きです。少ないコード。ファイルの関連付けのWindows内部実装への依存度が低くなります。 – RobertFrank

+0

@Robert:私はレジストリの問題について尋ねました。あなたのコードは正常に動作しますが、 'FindExecutable'よりも少し複雑です。 (私は自分の記憶をチェックし、権利のために 'KEY_EXECUTE'が何を意味しているのか正確に間違っていました。)そのパラグラフを削除するように編集しました。 –

関連する問題