问题 检查Excel OLE是否可用的正确方法是什么?


我需要测试是否可以从我的程序中使用Excel OLE,因为它可以在没有Excel的PC上启动。网上的代码示例假定安装了Excel,但如果没有,那该怎么办?

XLApp := CreateOleObject('Excel.Application');
try
  // Hide Excel
  XLApp.Visible := False;
  // Open the Workbook
  XLApp.Workbooks.Open(aPath);
  ...snip...
finally
  // Quit Excel
  if not VarIsEmpty(XLApp) then
  begin
    XLApp.Quit;
    XLAPP := Unassigned;
  end;
end;

这是否是正确的代码,以找到是否安装了Excel?

//Try to create Excel OLE
try
  XLApp := CreateOleObject('Excel.Application');
except
  ShowMessage('Error opening Excel');
  Exit;
end;

11134
2018-02-22 05:45


起源

对我来说似乎很合理。 - Joe


答案:


您可以使用基于的代码 Scalabium的提示 检查Excel是否可用。或类似的东西:

uses ComObj, ActiveX;

function IsObjectAvailable(const ClassName: string): Boolean;
var
  ClassID: TCLSID;
begin
  Result := Succeeded(CLSIDFromProgID(PWideChar(WideString(ClassName)), 
    ClassID));
end;

您还可以使用以下代码检查Excel是否正在运行:

function IsObjectActive(const ClassName: string): Boolean;
var
  ClassID: TCLSID;
  Unknown: IUnknown;
begin
  Result := False;
  if Succeeded(CLSIDFromProgID(PWideChar(WideString(ClassName)), ClassID)) then
    Result := Succeeded(GetActiveObject(ClassID, nil, Unknown));
end;

然后在某些程序或事件中:

procedure TForm1.Button1Click(Sender: TObject);
begin
  if IsObjectAvailable('Excel.Application') then 
    ShowMessage('Excel is available');
  if IsObjectActive('Excel.Application') then 
    ShowMessage('Excel is running');
end;

16
2018-02-22 07:36



+1但我会继续使用 try CreateOleObject except 在我的应用程序中,因为我相信这是确保我能够实现的唯一可靠方法 创建 一个对象实例(通过 CoCreateInstance)。上述方法可用作初步测试,以检查类是否正确注册。 - kobik
@kobik,我同意。在我的回答中,我假设OP只需要知道如何检查正在安装的Excel,以及 try CreateOleObject 无论如何都将用于对象实例创建部分。 - Guillem Vicens
@Guilem, CreateOleObject 也将做 OleCheck(CLSIDFromProgID... (ProgIDToClassID)无论如何。如果你打算这么做,我真的不会在第一时间再次看到这一点 try CreateOleObject 任何状况之下... - kobik
@kobik,imho它取决于。它们不一定需要耦合。例如,您可能只想检查是否安装了Excel以启用或禁用应用程序中的某些选项。然后,如果已启用,请使用 CreateOleObject 在必要时。当然,这似乎不是OP的情况。 - Guillem Vicens
@kobik,我会用这个,例如在一些应用程序启动时检查是否实际上不需要OLE对象的实例,或者在应用程序运行时期间根本不需要它(例如,当OLE对象可用时构建一些特殊菜单)。 - TLama