2016-12-07 4 views
1

У меня возникли проблемы с созданием экземпляра объекта StarOffice Desktop. Я использовал стандартную конструкцию ниже, но всякий раз, когда дело доходит до строки: StarDesktop := StarOffice.CreateInstance('com.sun.star.frame.Desktop'); My StarDesktop Variant остается неназначенным. Я почти уверен, что код в порядке, пока не будет, но, возможно, что-то с установкой OpenOffice будет испорчено. Есть ли способ проверить COM-объекты, или же кто-то имел такую ​​же проблему и может решить ...OpenOffice Desktop Instance не может быть создан (com object)

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 (я удалил и повторно установил его уже дважды » Опять же, я знаю, что это будет работать для других и, как правило, будет работать для меня, но что-то не так в моей системе, и я хотел бы знать некоторую помощь, чтобы указать мне в направлении, что может быть неправильным в системе (а не в примере кода ...)

+0

В StarOffice ServiceManager назначается после CreateOleObject! – Niels

+1

PLZ не использовать комментарии для исправления вопроса - отредактируйте вопрос и обновите текст. –

+1

вы можете попробовать использовать SysInternals Process Monitor, чтобы узнать, какие файлы ключей реестра были опробованы и с какими результатами при попытке создать рабочий стол –

ответ

1

является OpenOffice установлен на клиенте? не выбрасывает никаких исключений?

Я использую Bernard Marcelly «s Delphi 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 имеет нулевое значение, возможно, не может получить доступ к рабочему столу обслуживание Оо. Если OpenOffice установлен правильно, некоторые функции могут отсутствовать, параметры должны быть установлены.

+0

Предлагаю; 1-) Попробуйте использовать свой код на другом установленном клиенте OpenOffice. 2-) Попробуйте наши примеры на вашем клиенте. Значит, вы можете понять, проблема вашего компьютера? и 3 - Удалите свое открытое отделение и повторите попытку. Если симптомы одинаковы (StarDesktop имеет значение null), вы можете заподозрить вашу установку (возможно, вы можете загрузить другую версию OpenOffice). Я знаю, что это не решение, но для решения вам нужно уменьшить круг. По крайней мере, пока кто-нибудь не ответит. –

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; 
Смежные вопросы