vb.net Ошибка вызова DispatchHelper

Автор PilgrimS, 17 ноября 2025, 12:04

0 Пользователи и 1 гость просматривают эту тему.

PilgrimS

Прошу помощи у уважаемого сообщества
Есть старый проект на vb6, при переносе кода который строит файлы в LibreOffice столкнулся с проблемой - программа останавливается на последней строке с ошибкой
System.Runtime.InteropServices.COMException :  "Сбой при удаленном вызове процедуры. (Исключение из HRESULT: 0x800706BE)

Цель данного кода - простая. Создать новый файл и установить фокус в ячейку B3


Dim oSM As Object
Dim oDesk As Object
Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim oCells As Object
Dim BL As Object
Dim TB As Object
Dim arg(0) As Object


oSM = CreateObject("com.sun.star.ServiceManager")
oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")

oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
oSheet = oDoc.getSheets().getByIndex(0)
Dim oDispatcher As Object
oDispatcher = oSM.createInstance("com.sun.star.frame.DispatchHelper")

Dim args1(0) As Object
args1(0) = New PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = New uno.Any("B3")
oDispatcher.executeDispatch(oDoc.getCurrentController.getFrame, ".uno:GoToCell", "", 0, args1)

Пробовал для описания параметров использовать такой код, но результатов так же не добился
Dim oPropertyValue As Object
 Dim oSM As Object

 oSM = CreateObject("com.sun.star.ServiceManager")
 oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
 oPropertyValue.Name = cName
 oPropertyValue.Value = uValue

mikekaganski

#1
Цитата: PilgrimS от 17 ноября 2025, 12:04при переносе кода который строит файлы в LibreOffice столкнулся с проблемой

При переносе куда? (Ах да, в теме указано - vb.net. Вечная проблема, когда в тексте не хватает данных, и без постоянного перечитывания заголовка не поймёшь о чём речь...)

Цитата: PilgrimS от 17 ноября 2025, 12:04Пробовал для описания параметров использовать такой код, но результатов так же не добился

Этот код не представлен в достаточном виде, чтобы понять, как Вы его используете. И не указано, что значит "результатов не добился" - та же ошибка? Что-то другое?

Такой VBScript у меня работает:

oSM = CreateObject("com.sun.star.ServiceManager")
oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")

oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, array())
oSheet = oDoc.getSheets().getByIndex(0)
oDispatcher = oSM.createInstance("com.sun.star.frame.DispatchHelper")

oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oPropertyValue.Name = "ToPoint"
oPropertyValue.Value = "B3"
oDispatcher.executeDispatch oDoc.getCurrentController.getFrame, ".uno:GoToCell", "", 0, array(oPropertyValue)
С уважением,
Михаил Каганский

sokol92

А в такой "смешанной" редакции работает и в VBA (проверил, запустив макрос из Excel):
Option Explicit
Sub Test()

Dim oSM As Object
Dim oDesk As Object
Dim oDoc As Object
Dim oSheet As Object
Dim oCell As Object
Dim oCells As Object
Dim BL As Object
Dim TB As Object
Dim arg(0) As Object
Dim oPropertyValue As Object

Set oSM = CreateObject("com.sun.star.ServiceManager")
Set oDesk = oSM.createInstance("com.sun.star.frame.Desktop")

Set oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
Set oSheet = oDoc.getSheets().getByIndex(0)
Dim oDispatcher As Object
Set oDispatcher = oSM.createInstance("com.sun.star.frame.DispatchHelper")

Set oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
oPropertyValue.Name = "ToPoint"
oPropertyValue.Value = "B3"
oDispatcher.executeDispatch oDoc.getCurrentController.getFrame, ".uno:GoToCell", "", 0, Array(oPropertyValue)

End Sub

Владимир.

PilgrimS

Сегодня прошел регистрацию - теперь могу писать в форуме.
Уточняю подробности.

Изначально код был написан на Visual Basic (Visual Studio 6) Это почти аналог VBA (Visual Basic for Application) но выполняется как отдельное приложение а не из Microsoft Office
Сейчас этот код перенес на Vb.Net (Visual Studio 2022 целевая платформа .Net Framework 4.6.2) так же строится отдельное приложение (это не макрос)

Задача кода: Открыть новую книгу в Libre Office и установить фокус в ячейку B3.

Код программы:
       
        Dim oSM As Object
        Dim oDesk As Object
        Dim oDoc As Object
        Dim oSheet As Object
        Dim oCell As Object
        Dim oCells As Object
        Dim BL As Object
        Dim TB As Object
        Dim arg(0) As Object


        oSM = CreateObject("com.sun.star.ServiceManager")
        oDesk = oSM.CreateInstance("com.sun.star.frame.Desktop")

        oDoc = oDesk.loadComponentFromURL("private:factory/scalc", "_blank", 0, arg)
        oSheet = oDoc.getSheets().getByIndex(0)
        Dim oDispatcher As Object
        oDispatcher = oSM.createInstance("com.sun.star.frame.DispatchHelper")

        ' Вариант 1 - создание параметра через подключение SDK/CLI
        Dim args1(0) As Object
        args1(0) = New PropertyValue
        args1(0).Name = "ToPoint"
        args1(0).Value = New uno.Any("B3")

        ' Вариант 2 - определение параметра через "GetStruct"
        'Dim args1(0) As Object
        'args1(0) = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
        'args1(0).Name = "ToPoint"
        'args1(0).Value = "B3"

        'Ошибка возникает здесь:
        oDispatcher.executeDispatch(oDoc.getCurrentController.getFrame, ".uno:GoToCell", "", 0, args1)

Программа успешно создает пустой лист, создает объект DispatchHelper и определяет параметр для передачи в executeDispatch (последняя строка в коде)

При этом если параметр определять первым способом получаю ошибку
System.Runtime.InteropServices.COMException: "Сбой при удаленном вызове процедуры. (Исключение из HRESULT: 0x800706BE)"

Если первый способ закомментировать и раскомментировать второй способ получаю другую ошибку:
System.Runtime.InteropServices.COMException: "Член группы не найден. (Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND))"

Способ указанный sokol92 эквивалентен моему варианту 2 и он работал на Visual Basic 6 изначально
Не работает именно в Visual Studio 2022

Получается проблема где-то при определении/передаче параметра

mikekaganski

Прикрепите проект Visual Studio для тестирования (там будет всё - с настройками, в т.ч. что подключается). Укажите, какую версию LibreOffice Вы используете. Возможно, это баг, связанный с переделкой .net binding (отчёт).
С уважением,
Михаил Каганский

PilgrimS

Приимер проекта TestLibreOffice.7z
Версия Libre Office 25.8.3.2(x86_64)

bigor

А почему нельзя без DispatchHelper?
 oDoc = ThisComponent
 oRange1=oDoc.oSheet.getCellRangeByName("A10")
 oDoc.CurrentController.Select(oRange1)
Поддержать наш форум можно здесь

PilgrimS

Можно и без диспатчера. Но - существует более 20 отчетов которые построены по этой технологии и в них это не единственная команда работы с диспатчером (почему написано именно так сказать не смогу). Нужно будет переписать все эти отчеты с учетом этого.

mikekaganski

Цитата: PilgrimS от 20 ноября 2025, 10:20Приимер проекта TestLibreOffice.7z
Спасибо!

В обоих случаях баг.

В случае New PropertyValue в дальнейшем этот объект обрабатывается в LibreOffice не как структура, а как интерфейс (и рушит процесс при разыменовании nullptr).

В случае oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue") всё отрабатывает, а ошибка в коде, возвращающем значение в вызывающую процедуру.

Напишите багрепорт.
С уважением,
Михаил Каганский

PilgrimS

Получается - в настоящее время ничего с этим сделать нельзя я правильно понимаю? Только переписывать все в стиле который предложил bigor

economist

Переписать все - правильно, но на это нужно время.

Мы периодически переводим невесть откуда берущиеся старые отчеты с Диспетчера на API-методы и еще часть с Excel в Calc. Наиболее просто это удается тем, кто тупо заново перезаписал рекордером диспетчер-макрос в Excel, а затем в Calc скопировал модуль, добавил вверху модуля Option VBASupport 1 и прорядил нудный и избыточный "рекорженый" код до краткой нотации вида [A1] = "Отчет", заодно налету создав именованные диапазоны типа [_ИМЯ_ОТЧЕТА] = "Отчет" (чем уменьшил число будущих проблем вдвое).

Такой щадящий рефакторинг оказался по зубам всем, как хороший баланс между сложностью и ленью. Не призываю повторять, но экономия времени по сравнению с реализацией штатными методам - 4:1 (как и размер самого кода в символах).
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...