Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

15 Август 2022, 22:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Здесь можно поблагодарить участников форума Улыбка
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Как определить название приложения из C# (отделено от https://forumooo.ru/index.php/topic,8926.0.html)  (Прочитано 1468 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Стартовое сообщение: 15 Декабрь 2021, 19:09 »

Ясно. Спасибо, Михаил.
А можно как-то узнать, какое приложение стартовало: LO или OO?
В VB это делается так:
Код:
GlobalScope.BasicLibraries.LoadLibrary("Tools")
ProgramName = GetProductname()
Я не очень представляю, как в C# CLI дать ссылку на библиотеку Tools.
« Последнее редактирование: 17 Декабрь 2021, 17:45 от Борис_С » Записан
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #1: 18 Январь 2022, 16:42 »

Форумчане, подскажите, пожалуйста, в каком файле сидит библиотека Tools.
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 822


« Ответ #2: 18 Январь 2022, 16:54 »

В VB это делается так:
Код:
GlobalScope.BasicLibraries.LoadLibrary("Tools")
ProgramName = GetProductname()

Я подозреваю, что имеется ввиду не VB (Visual Basic), а StarBasic (язык семейства Basic, реализованный в OOo/LO/AOO).

1. Создаёте процедуру, вызывающую GetProductname в Basic IDE.
2. Ставите на неё точку останова.
3. Запускаете процедуру.
4. При остановке отладчика на нужной строке используете функцию Step Into (F8), и попадаете в код вызываемой функции.
5. Изучаете этот код.

В частности, Вам понадобится разобраться, что делает функция GetRegistryKeyContent (её код там же), и реализовать такую же логику чтения конфигурации на C#.
« Последнее редактирование: 18 Январь 2022, 16:57 от mikekaganski » Записан

С уважением,
Михаил Каганский
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #3: 18 Январь 2022, 17:01 »

Не знаю почему, но при нажатии на F8 на этом операторе я попадаю на след. оператор, а не вхожу внутрь.
Я не прав. Поставил точку останова не на том операторе.
« Последнее редактирование: 18 Январь 2022, 17:03 от Борис_С » Записан
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #4: 18 Январь 2022, 17:05 »

А зачем это делать, если можно просто сослаться на библиотеку Tools и вызвать из нее функцию GetProductname() ?
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 822


« Ответ #5: 18 Январь 2022, 17:09 »

Библиотека Tools - это библиотека Basic. Конечно, можно воспользоваться механизмом invoke, чтобы из любого языка вызвать функции на любом языке, но это примерно как из пушки по воробьям.
Записан

С уважением,
Михаил Каганский
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #6: 18 Январь 2022, 17:39 »

Нигде не нашел, как оператор oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
перевести на C#
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 822


« Ответ #7: 18 Январь 2022, 17:48 »

Код:
                XComponentLoader componentLoader = (XComponentLoader)
                    multiServiceFactory.createInstance("com.sun.star.frame.Desktop");

Вот это оно (конечно, нужно изменить имя и тип сервиса).
Записан

С уважением,
Михаил Каганский
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #8: 18 Январь 2022, 19:19 »

Забуксовал. Не могу сформировать тип сервиса. У пространства имен unoidl.com.sun.star.configuration нет сервиса ConfigurationProvider.
В API пишут, что сервис ConfigurationProvider находится в пространстве имен com::sun::star::configuration::DefaultProvider::ConfigurationProvider
В пространстве имен unoidl.com.sun.star.configuration нет имени DefaultProvider
« Последнее редактирование: 18 Январь 2022, 19:39 от Борис_С » Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 822


« Ответ #9: 18 Январь 2022, 19:59 »

Сервис - это категория, не относящаяся к языку. Это своего рода "гарантия", предоставляемая IDL. Она не отображается на систему типов языка.

Вам нужен тип, и такими типами являются интерфейсы. В IDL их имена всегда начинаются с заглавной "X". Соответственно, когда Вы создаёте экземпляр сервиса, Вы присваиваете возвращаемый объект переменной одного из типов-интерфейсов. В Вашем случае документация сервиса ConfigurationProvider сообщает, что сервис реализует два интерфейса - XMultiServiceFactory и XComponent. Вы выбираете, какой из интерфейсов Вас интересует в данный момент. Поскольку Вы будете дальше вызывать метод createInstanceWithArguments, Вам понадобится объект класса XMultiServiceFactory.

В API пишут, что сервис ConfigurationProvider находится в пространстве имен com::sun::star::configuration::DefaultProvider::ConfigurationProvider

Нет. В API пишут, что у сервиса DefaultProvider есть одноимённое свойство. Но оно Вам не нужно.
Записан

С уважением,
Михаил Каганский
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 985


WWW
« Ответ #10: 18 Январь 2022, 21:28 »

... из любого языка вызвать функции на любом языке, но это примерно как из пушки по воробьям.
Наставление по стрельбе здесь (в том числе и для C#).
« Последнее редактирование: 18 Январь 2022, 21:30 от sokol92 » Записан

Владимир.
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #11: 19 Январь 2022, 12:03 »

В функции GetRegistryKeyContent возвращаемое значение формируется так:
Код:
GetRegistryKeyContent() = oConfigProvider.createInstanceWithArguments("com.sun.star.configuration.ConfigurationAccess", aNodePath())
где
Код:
Dim aNodePath(0) as new com.sun.star.beans.PropertyValue
        oConfigProvider = createUnoService("com.sun.star.configuration.ConfigurationProvider")
aNodePath(0).Name = "nodepath"
aNodePath(0).Value = sKeyName
В коде на C# я написал так:
Код:
           PropertyValue[] values = new PropertyValue[1];
            values[0] = new PropertyValue();
            values[0].Name = "nodepath";
            values[0].Value = new uno.Any(sKeyName);
            XMultiServiceFactory oConfigProvider = (XMultiServiceFactory)
                    multiServiceFactory.createInstance("com.sun.star.configuration.ConfigurationProvider");
            GetRegistryKeyContent = oConfigProvider.createInstanceWithArguments(
                "com.sun.star.configuration.ConfigurationAccess", values);
На последнем операторе C# ругается. Говорит 2-ой аргумент должен быть uno.Any[] и не может привести PropertyValue[] к uno.Any[],
хотя в коде на VB 2-ой аргумент - PropertyValue[].
Записан
mikekaganski
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 822


« Ответ #12: 19 Январь 2022, 12:31 »

То, что в коде на Basic (нет у нас VB! даже VBA поддерживается только частично, а это другой зверь) "2-ой аргумент - PropertyValue[]" - неважно. Basic - язык с нестрогой системой типов, и для его работы необходима прослойка преобразований, которая сама заботится о нужных заклинаниях. Вы пользуетесь C#, и для Вас главное - это спецификация.

Действительно, метод ждёт массив из Any. Создавайте его, а отдельные его значения инициализируйте отдельными объектами PropertyValue.
Записан

С уважением,
Михаил Каганский
Борис_С
Форумчанин
***
Offline Offline

Сообщений: 229


« Ответ #13: 19 Январь 2022, 13:08 »

Разобрался. Вот код:
Код:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using Microsoft.Win32;

using unoidl.com.sun.star.lang;
using unoidl.com.sun.star.uno;
using unoidl.com.sun.star.bridge;
using unoidl.com.sun.star.frame;
using unoidl.com.sun.star.text;
using unoidl.com.sun.star.script.provider;
using unoidl.com.sun.star.sheet;
using unoidl.com.sun.star.table;
using unoidl.com.sun.star.util;
using unoidl.com.sun.star.beans;
using unoidl.com.sun.star.container;
using unoidl.com.sun.star.style;
using unoidl.com.sun.star.view;
using unoidl.com.sun.star.configuration;

namespace ConsoleApp
{
    public class Program
    {
        XMultiServiceFactory multiServiceFactory;
       
        static void Main(string[] args)
        {
                XComponentContext localContext = uno.util.Bootstrap.bootstrap();
                multiServiceFactory = (XMultiServiceFactory)localContext.getServiceManager();
                // получение имени и версии запущенного приложения
                string productName = GetProductname();
        }

        private string GetProductname()
        {
            PropertyValue values = new PropertyValue();
            values.Name = "nodepath";
            values.Value = new uno.Any("org.openoffice.Setup/Product");
            uno.Any[] args = new uno.Any[1];
            args[0] = new uno.Any(typeof(PropertyValue), values);
            XMultiServiceFactory oConfigProvider = (XMultiServiceFactory)
                    multiServiceFactory.createInstance(
                        "com.sun.star.configuration.ConfigurationProvider");
            XNameAccess xNameAccess =
                (XNameAccess)oConfigProvider.createInstanceWithArguments(
                "com.sun.star.configuration.ConfigurationAccess", args);
            string sProdName = (string)xNameAccess.getByName("ooName").Value;
            string sVersion = (string)xNameAccess.getByName("ooSetupVersion").Value;
            return sProdName + " " + sVersion;
        }
    }
}
Это было не просто, но результат оправдал затраченные усилия. Всем спасибо. Особенно mikekaganski.
Записан
sokol92
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 985


WWW
« Ответ #14: 19 Январь 2022, 14:52 »

Отлично. Скоро и мы станем специалистами по санскриту C#.  Улыбка
Записан

Владимир.
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!