6

我们通过我们的应用程序提供安装在本地 (Windows) 硬盘上的 Flash 教程视频。我们的应用程序使用 ShellExecute 打开嵌入它们的 html 文件(在与 html 文件关联的任何浏览器中)。

显然,Chrome 最新的 Flash 播放器存在一个错误,无法播放本地文件(但网络上的文件很好。)

(坦率地说,我很惊讶谷歌没有修复这个错误。对我来说似乎是一个大问题......但也许没有多少人从网络以外的地方玩 Flash?)

Chrome 中的 about:plugins 屏幕上有一个解决方法,但我们不能要求我们的用户这样做。以下是解决方法的讨论:http: //techsmith.custhelp.com/app/answers/detail/a_id/3518

我想为我的用户提供一个选项来打开我们的 html 文件 IE。 如果 Chrome 是他们的默认浏览器,那么我会显示一个复选框,上面写着令人尴尬的内容,例如“如果我们的教程视频无法播放,请选中此框以在 IE 中尝试它们。”

这个 XE2 代码(从两年前的 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 回答