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

Kro*_*ica 11 delphi 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;
Run Code Online (Sandbox Code Playgroud)

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

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

Gui*_*ens 16

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

uses ComObj, ActiveX;

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

您还可以使用以下代码检查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;
Run Code Online (Sandbox Code Playgroud)

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

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;
Run Code Online (Sandbox Code Playgroud)

  • +1但是我会继续在我的应用程序中使用`try CreateOleObject except`,因为我相信这是确保我可以实际*创建*对象实例(通过`CoCreateInstance`)的唯一可靠方法.上述方法可用作初步测试,以检查类是否正确注册. (7认同)
  • @kobik,我会在一些应用程序启动时使用它来检查是否实际上不需要OLE对象的实例(或者),或者在应用程序运行时期间可能根本不需要(例如,在构建时创建一些特殊菜单) OLE对象可用). (2认同)