[pascal] Rejestrowanie OCX - Flash

0

Witam,

potrzebuję osadzic flasha w programie, w tym celu zaimportowałem komponent shockwave activeX.
Wszystko u mnie śmiga jak należy/ Natomiast na innych maszynach program się "wywala" na starcie (access vilation itp).

Komponent OCX nalezy zarejestrować w systemie użytkownika.

Robie to następująco:
Do katalogu z programem skopiowałem plik Flash10c.ocx

W programie w OnCreate glownej formy wywoluje procedure:

procedure RegisterOCX;
type
  TRegFunc = function : HResult; stdcall;
var
  ARegFunc : TRegFunc;
  aHandle  : THandle;
  ocxPath  : string;
begin
 try
  ocxPath := ExtractFilePath(Application.ExeName) + 'Flash10c.ocx';
  aHandle := LoadLibrary(PChar(ocxPath));
  if aHandle <> 0 then
  begin
    ARegFunc := GetProcAddress(aHandle,'DllRegisterServer');
    if Assigned(ARegFunc) then
    begin
      ExecAndWait('regsvr32',' ' + ocxPath);
    end;
    FreeLibrary(aHandle);
  end;
 except
  ShowMessage(Format('Unable to register %s', [ocxPath]));
 end;
end;
 

Co robię źle?

PS
plik flash10c.ocx znalazłem na dysku C i skopiowałem go do fodleru z programem, może trzeba go jakoś specjalnie wygenerować?

0

Teoretycznie powinno działać bo widzę że robisz wg, tego http://delphi.about.com/od/windowsshellapi/l/aa040803a.htm
ale jak nie działa to pobierz instalator flash playera np.: http://fpdownload.macromedia.com/get/flashplayer/current/licensing/win/install_flash_player_10_active_x.exe i:

path:= ExtractFilePath(Application.ExeName) + 'install_flash_player_10_active_x.exe';
ExecAndWait(path, '-install');

A może są potrzebne prawa admina i dlatego nie działa?

0

Witam,

pierwszy raz robie cos takiego, mam pytanie:

rozumiem ze flash musi byc zainstalowany, samo zarejestrowanie pliku OCX nie wystarczy?

0

Właśnie w tym sęk, że wystarczało (przynajmniej w starszych wersjach) i nie wiem dlaczego flash nie działa. Sprawdzałeś czy w IE działa zarejestrowany w ten sposób flash? Jedynie co mi przychodzi na myśl to to że do rejestracji może wymagać uprawnień administratora.

No i tak jak podałem możesz zainstalować normalnie z instalatora parametr -install oznacza, że instalacja będzie cicha (nie będzie widać okna instalatora).

0

Nie sprawdzałem czy w IE działa, sprawdze przy najbliższej okazji (u siebie mam zainstalowanego flasha).

Mam jeszcze jedno pytanie, jak wykryc z poziomu delphi czy flash jest zainstalowany, mam 3 pomysły:

  • Sprawdzić ścieżki, "C:\Windows\SysWOW64\Macromed\Flash", "C:\Windows\System32\Macromed\Flash"
  • Sprawdzić czy flash jest zarejestrowany za pomoca regserv, tylko tu jest porblem bo flashe mają różne wersje, Flash9d.ocx 10c, 8d, 8e itp.
  • Zrobić coś na wzór funkcji z InnoSetup
 
function IsFlashInstalled(): boolean;
var
  V: Variant;
begin
  try
    V := CreateOleObject('ShockwaveFlash.ShockwaveFlash.9');
    Result := True;
  except
    Result := False;
  end;
end;

Jak myślisz który sposób jest najlepszy, najpewniejszy?

Czy jeśli mam zaimportowanego (w delphi) ActiveX shockwave flash z wersji 10, a ktoś ma u siebie na komputerze flash ver 8? To czy program będzie działać prawidłowo?

0

Nie wiem mi się wydaje że lepszym jest sprawdzenie:

//zwraca true jeżeli jest zainstalowany
function IsFlashInstaled: Boolean;
var
  reg: TRegistry;
begin
  result:= False;
  reg:= TRegistry.Create(KEY_READ);
  try
  reg.RootKey:= HKEY_CLASSES_ROOT;
  if reg.OpenKeyReadOnly('CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}\InprocServer32') then
  begin
    result:= FileExists(reg.ReadString(''));
  end;
  finally
  reg.Free;
  end;
end;

A tu taka bardziej złożona metoda, którą teraz napisałem /nie za bardzo przetestowana/

function GetFileVersion(path: string): string;
var
  VerInfoSize: DWORD;
  VerInfo: Pointer;
  VerValueSize: DWORD;
  VerValue: PVSFixedFileInfo;
  Dummy: DWORD;
begin
  VerInfoSize := GetFileVersionInfoSize(PAnsiChar(path), Dummy);
  GetMem(VerInfo, VerInfoSize);
  GetFileVersionInfo(PAnsiChar(path), 0, VerInfoSize, VerInfo);
  VerQueryValue(VerInfo, '\', Pointer(VerValue), VerValueSize);
  with VerValue^ do
  begin
    Result := IntToStr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntToStr(dwFileVersionLS shr 16);
    Result := Result + '.' + IntToStr(dwFileVersionLS and $FFFF);
  end;
  FreeMem(VerInfo, VerInfoSize);
end;

function GetFlashVersion: string;
var
  reg: TRegistry;
  flashfile: string;
begin
  result:= '';
  reg:= TRegistry.Create(KEY_READ);
  try
  reg.RootKey:= HKEY_CLASSES_ROOT;
  if reg.OpenKeyReadOnly('CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}\InprocServer32') then
  begin
    flashfile:= reg.ReadString('');
    if FileExists(flashfile) then
      result:= GetFileVersion(flashfile);
  end;
  finally
  reg.Free;
  end;
end;


//0  takie same
//-1  ver1 > ver2
//1 ver1 < ver2
function CompareFileVersion(ver1, ver2: string): Integer;

type TVersionArray = array [0..3] of Word;

  procedure FileVersionToArray(verstr: string; var tab: TVersionArray);
  var
    sl: TStringList;
    i: Integer;
    len: Integer;
  begin
    sl:= TStringList.Create;
    try
    verstr:= StringReplace(verstr, '.', ',', [rfReplaceAll]);
    //sl.Delimiter:= '.';
    sl.CommaText:= verstr;
    len:= sl.Count - 1;
    if (len > High(tab)) then
      len:= High(tab);
    for i:= 0 to len do
    begin
      tab[i]:= StrToIntDef(sl[i], 0);
    end;
    finally
    sl.Free;
    end;
  end;

const
  {$J+}
  tab1: TVersionArray = (0, 0, 0, 0);
  tab2: TVersionArray = (0, 0, 0, 0);
  {$J-}

var
  i: Integer;
begin
  result:= 0;
  FileVersionToArray(ver1, tab1);
  FileVersionToArray(ver2, tab2);
  for i:=0 to 3 do
  begin
    if tab1[i] > tab2[i] then
    begin
      result:= -1;
      exit;
    end;
    if tab1[i] < tab2[i] then
    begin
      result:= 1;
      exit;
    end;
  end;
end;


function MustInstallFalsh(instVer: string): Boolean;
begin
  result:= CompareFileVersion(GetFlashVersion, instVer) > 0;  
end;

Wywołujesz funkcję MustInstallFalsh podając jako parametr wersje flasha jaka chcesz zainstalować zwróci true jeżeli trzeba instalować (czyli użytkownik nie ma flasha lub ma starszą wersję) false jeżeli ma taką samą lub nowszą. Przykład wywołania:

if MustInstallFalsh('10.1.102.64') then
    ShowMessage('Trzeba instalować')
  else
    ShowMessage('Nie trzeba instalować');

Trochę pokręcona funkcja ale wydaje się powinna działać sprawdzałem u siebie podając przykładowe wersje flasha i niby działa.

0 użytkowników online, w tym zalogowanych: 0, gości: 0