Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 90. - Zjištění, je-li příslušná aplikace Office nainstalována či spuštěna

Jan Šindelář - 14.5.2003

Zjištění, je-li příslušná aplikace Office nainstalována či spuštěna

Posledních pár dílů jsme věnovali různým tipům pro aplikace Office. Ve většině případů jsme používali technologie OLE a tím pádem byla funkčnost našich příkladů závislá na tom, zda je či není příslušná aplikace v našem systému nainstalována. I když jsme vždycky používali bezpečný způsob, který by v případě nepřítomnosti dané aplikace nezpůsobil pád našeho programu, určitě by bylo dobré předem vědět, jestli je aplikace v systému dostupná či ne.

Způsobů, jak to zjistit, existuje samozřejmě jako vždy více. My zvolíme jeden z těch jednodušších, který pracuje s registry. Z nich na příslušném místě vyčteme potřebnou informaci o přítomnosti či nepřítomnosti dané aplikace Office v systému. Společný zdrojový kód pro oba dnešní příklady naleznete dále.

Dalším problémem, který by mohl teoreticky v určitých případech při našich hrátkách s OLE (a nejen s ním) nastat, je drobná kolize mezi naším programem a příslušnou aplikací. Bude-li se náš program snažit zneužít danou aplikaci k nějaké činnosti zatímco aplikace běží a má v danou chvíli na práci úplně jiné věci, může dojít k problémům. Sice by neměla nastat žádná velká kolize a vše by mělo být dostatečně ošetřeno, ale přesto by bylo určitě dobré vědět, jestli je příslušná aplikace spuštěna a zda si můžeme dovolit ji zatížit na další půlhodinu našimi pokusy. To již záleží na povaze vaší aplikace a funkcích, které bude prostřednictvím OLE od aplikací Office požadovat. K tomu tedy slouží naše druhá dnešní funkce, která je opět velmi jednoduchá a využívá jednotek ComObj a ActiveX.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComObj, ActiveX, Registry;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function IsObjectActive(const ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  try
    ClassID := ProgIDToClassID(ClassName);
    Result  := GetActiveObject(ClassID, nil, Unknown) = S_OK;
  except
    Result := False;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsObjectActive(`Word.Application`) then ShowMessage(`Word je spusten.`);
  if IsObjectActive(`Excel.Application`) then ShowMessage(`Excel je spusten.`);
  if IsObjectActive(`Outlook.Application`) then ShowMessage(`Outlook je spusten.`);
  if IsObjectActive(`Access.Application`) then ShowMessage(`Access je spusten.`);
  if IsObjectActive(`Powerpoint.Application`) then ShowMessage(`Powerpoint je spusten.`);
end;

function OfficeAppInst(const ClassName: string): Boolean;
var
  Reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Result := Reg.KeyExists(ClassName);
  finally
    Reg.Free;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if OfficeAppInst(`Word.Application`) then ShowMessage(`Word je nainstalovan.`);
end;

end.

Jak vidíte, funkce jsou velmi jednoduché a obě mají stejné parametry. A tím na nějaký čas s Office končíme a příště se zase vrhneme na jiné téma.