【问题标题】:OpenOffice Desktop Instance can not be created (com object)无法创建 OpenOffice 桌面实例(com 对象)
【发布时间】:2017-04-21 23:42:27
【问题描述】:

我在创建 StarSuite Desktop 对象的实例时遇到了一些问题。 我使用了下面的标准构造,但每当涉及到这一行时:StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop'); 我的 StarDesktop 变体保持未分配状态。我很确定代码在那里之前是可以的,但也许 OpenOffice 安装的某些东西搞砸了。 有没有办法检查 com 对象或者有人遇到同样的问题并且可以解决它......

uses
  ComObj;

procedure OpenOfficeDocument;
var
  StarOffice: Variant;
  StarDesktop: Variant;
begin
  StarOffice := CreateOleObject('com.sun.star.ServiceManager');
  StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop');
  // StarDesktop is always "unassigned"
....

是的,我知道。我应该更清楚地说明我太 100% 确信它会在正确的环境中正常工作。 但我的问题是它不起作用的原因可能是什么。为什么'com.sun.star.frame.Desktop' 实例未分配。我没有选项/方法来调试它... 投票给我有点不公平,我研究了一个小时,却没有找到解释为什么它不能工作的东西。 或者如何以及在哪里检查 Office 安装是否有问题(我已经卸载并重新安装了两次” 同样,我知道这对其他人有用,通常对我也有用,但是我的系统出了点问题,我想知道一些帮助来指出系统中可能出现的问题(而不是代码中的问题)示例...)

【问题讨论】:

  • StarOffice ServiceManager 是在 CreateOleObject 之后分配的!
  • 请不要使用 cmets 来解决问题 - 编辑问题并更新文本。
  • 您可以尝试使用 SysInternals Process Monitor 来查看尝试创建桌面时尝试了哪​​些注册表项文件以及结果
  • 尝试getAvailableServiceNames 看看桌面名称是否被提供给您的服务管理器知道 - openoffice.org/api/docs/common/ref/com/sun/star/lang/…

标签: delphi com openoffice.org delphi-xe7


【解决方案1】:

客户端是否安装了 OpenOffice? 不抛出任何异常?

我正在使用Bernard MarcellyDelphi 7 OOo tool,你可以看到他的代码;

var
  OpenOffice, StarDesktop: Variant;

...
    OpenOffice:= CreateOleObject('com.sun.star.ServiceManager');
    if isNullEmpty(OpenOffice) then Raise Exception.Create('OpenOffice connection is impossible');
    StarDesktop:= OpenOffice.createInstance('com.sun.star.frame.Desktop');
    if isNullEmpty(Result) then Raise Exception.Create(Format('Impossible to create service : %s', ['com.sun.star.frame.Desktop']));
...

'一些常量转成字符串'

因此,如果 StarDesktop 为 null,则可能无法访问 Oo Desktop 服务。如果 OpenOffice 安装正确,某些功能可能会丢失,必须设置选项。

【讨论】:

  • 我建议; 1-) 在另一个安装了 OpenOffice 的客户端上尝试您的代码。 2-) 在您的客户端上尝试我们的示例。所以你能理解你的电脑有问题吗?和 3 - 卸载您的 openoffice 并重试。如果症状相同(StarDesktop 为空),您可能会怀疑您的安装(可能您可以下载另一个 OpenOffice 版本)我知道这不是解决问题,而是解决问题,您应该缩小圆圈。至少在有人得到答案之前。
【解决方案2】:

这对我有用(在我的应用程序中):

class procedure TOpenOffice.Connect;
begin
  if IsConnected then
    Exit;
  try
    FServiceManager := CreateOleObject('com.sun.star.ServiceManager');
  except
    FServiceManager := Null;
  end;
  if VarIsNull(FServiceManager) then
    raise EOpenOfficeException.Create(StrConnectionFailed);
  FDesktop := CreateService('com.sun.star.frame.Desktop');
  FDispatchHelper := CreateService('com.sun.star.frame.DispatchHelper');
  FIntrospection := CreateService('com.sun.star.beans.Introspection');
  FReflection := CreateService('com.sun.star.reflection.CoreReflection');
end;

和:

class function TOpenOffice.CreateService(const ServiceName: string): Variant;
begin
  Result := FServiceManager.createInstance(ServiceName);
  if VarIsNull(Result) then
    raise EOpenOfficeException.CreateFmt(StrCouldNotCreateService,     
      [ServiceName]);
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-13
    • 2015-10-14
    • 2013-08-19
    相关资源
    最近更新 更多