无法创建OpenOffice桌面实例(com对象)

时间:2016-12-07 06:08:11

标签: delphi com openoffice.org delphi-xe7

我在创建StarOffice Desktop对象的实例时遇到了一些问题。 我使用下面的标准构造,但每当涉及到这一行时:StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop'); 我的StarDesktop Variant保持未分配状态。我很确定代码是可以的,直到那里,但也许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安装是否有问题(我已经卸载并重新安装了两次" 再一次,我知道这对其他人有用,通常对我有用,但我的系统出了问题,我想知道一些帮助,指出我在系统中可能出错的方向(而不是在代码中)示例...)

2 个答案:

答案 0 :(得分: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 :(得分:1)

这对我有用(在我的申请中):

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;