6

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

どうやら、Chromeの最近のFlashプレーヤーには、ローカルファイルの再生に失敗するバグがあります(ただし、Web上のファイルは問題ありません)。

(率直に言って、このバグがGoogleによって修正されていないことに驚いています。私にとっては大きなバグのようです...しかし、Web以外の場所からFlashをプレイする人はあまりいないのではないでしょうか?)

Chromeのabout:plugins画面には回避策がありますが、ユーザーにそうするように依頼することはできません。回避策の説明は次のとおりです。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;
4

1 に答える 1

4

ディスク上の既存のファイルへの実際のフルパスがある場合は、代わりにFindExecutableを使用できます。それはより簡単で、レジストリへのアクセスを必要としませんが、実際のファイルが存在する必要があります。

使用法を示すXE2のコンソールアプリは次のとおりです。

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以降で機能します。

于 2012-08-15T00:59:55.327 に答える