Определить 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 и выше.