Определить Chrome как браузер, связанный с HTML-файлами в Windows

Вместе с нашим приложением мы предоставляем обучающие видеоролики по Flash, которые устанавливаются на локальный (Windows) жесткий диск. Наше приложение использует ShellExecute для открытия html-файла (в любом браузере, связанном с html-файлами), в который они встроены.

Видимо, есть ошибка в более поздних Flash-плеерах Chrome, которая не воспроизводит локальные файлы (но файлы через Интернет - это нормально.)

(Честно говоря, я удивлен, что эта ошибка не была исправлена ​​Google. Мне кажется, это большая ошибка... но, может быть, не многие люди играют в Flash из других мест, кроме Интернета?)

На экране about:plugins в Chrome есть обходной путь, но мы не можем просить наших пользователей сделать это. Вот обсуждение обходного пути: 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;

1 ответ

Решение

Если у вас есть фактический полный путь к существующему файлу на диске, вы можете использовать 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 и выше.

Другие вопросы по тегам