【问题标题】:What is the proper way to check if Excel OLE is available?检查 Excel OLE 是否可用的正确方法是什么?
【发布时间】:2013-02-22 05:45:25
【问题描述】:

我需要测试是否可以在我的程序中使用 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;

【问题讨论】:

  • 对我来说似乎很合理。

标签: excel delphi ole


【解决方案1】:

您可以使用基于Scalabium's tip 的代码来检查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;

【讨论】:

  • +1 但我会继续在我的应用程序中使用try CreateOleObject except,因为我相信这是确保我能够真正创建对象实例的唯一可靠方法(通过CoCreateInstance)。上面的方法可以作为初步测试,检查类是否正确注册。
  • @kobik,我同意。在我的回答中,我假设 OP 只需要知道如何检查是否安装了 Excel,并且 try CreateOleObject 无论如何都会用于对象实例创建部分。
  • @Guilem, CreateOleObject 也将做OleCheck(CLSIDFromProgID... (ProgIDToClassID) 反正。因此,如果您打算在任何情况下 try CreateOleObject...
  • @kobik,恕我直言,这取决于。它们不一定需要耦合。例如,您可能只想检查是否安装了 Excel 以启用或禁用应用程序中的某些选项。然后,如果已启用,请在必要时使用CreateOleObject。当然,这似乎不是 OP 的情况。
  • @kobik,我会用这个,例如在某些应用程序启动时检查 OLE 对象的实例是否实际上不需要(还),或者在应用程序运行时可能根本不需要(例如,在 OLE 对象可用时构建一些特殊菜单)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-16
  • 1970-01-01
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-05
相关资源
最近更新 更多