SLMessageServer и VB Excel 2010

Здесь обсуждаются любые продукты компании СофтЛаб-НСК для телевизионного вещания (Форвард Т, Форвард ТС, Форвард Голкипер, Форвард Рефери, Форвард Офис, Форвард Инжест)

Модераторы: Людмила, PR, vd, Даниленко Сергей

Ответить
AlMaz
Сообщения: 65
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

SLMessageServer и VB Excel 2010

Сообщение AlMaz » 20 ноя 2019 16:48

Добрый день. Возникла разовая задача, требующая сделать в Экселе кнопки запускающие/убирающие титровальные объекты.

Почитал документацию по SLMessageServer, темы на форуме - COM объекты отлично используются в VB Экселя.
1) Создание объекта происходит, имя компьютера он отдает
Set gl_OnAir_SLMSConnection = CreateObject("SLMessageQueue2.SLMSConnection")
gl_OnAir_SLMSConnection.GetName gl_NameComp_str

2) Но к сожалению, на этапе создания CreateQueue и SendMessage, Эксель 2010 выдает ошибку "function or interface marked as restricted or the function uses an automation type not supportet in Visual Basic"

Dim gl_OnAir_ErrorCode As SLMessageQueue2Lib.SLMSErrorCode
Dim gl_HRESULT As Variant
...
Dim gl_OnAir_retQueue As Variant

gl_HRESULT = gl_OnAir_SLMSConnection.CreateQueue(gl_OnAir_ErrorCode, gl_OnAir_ResultCode, gl_OnAir_BSTR_Name, gl_OnAir_NotifyHwnd, gl_OnAir_NotifyCmd, gl_OnAir_NotifyWParam, gl_OnAir_NotifyLParam, gl_OnAir_retQueue)
Worksheets(gl_Button_Sheet_Name).Cells(3, 3).Value = gl_HRESULT

Исходный код с определением типов в библиотеке известен только вам.
Гугл на запрос об ошибке сообщает что возможно проблема VB в
том что используется unsigned long, который VB не понимает.
Или в использовании ClassInterfaceType.None.

К сожалению видимо прийдется писать стороннюю программу, которая свяжет таблицу в Экселе и OnAir.

Файлик со скриптом могу отдать для теста, там все только в начальной стадии работы.

Игорь Таранцев
Сообщения: 489
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев » 20 ноя 2019 19:54

А что Вы подставляете в качестве параметра gl_OnAir_NotifyHwnd?

AlMaz
Сообщения: 65
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz » 21 ноя 2019 09:10

1) Идентификатор окна самого Excel : gl_OnAir_NotifyHwnd = Application.Hwnd
Дело скорее всего точно не в нем, ведь в
gl_RESULT_Send = gl_OnAir_SLMSConnection.SendMessage(gl_OnAir_ErrorCode, gl_OnAir_ResultCode, gl_OnAir_MessId, gl_OnAir_ReplyTo, gl_OnAir_ToMachine, gl_OnAir_ToQueue, gl_OnAir_Subject, gl_OnAir_Body)
этого параметра нет, а ошибка та же.
А Excel VB даже при попытке вызова метода без параметров, сразу выдает эту ошибку. Т.е. скорее всего на этапе проверки типов данных передаваемых методу.

Игорь Таранцев
Сообщения: 489
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев » 21 ноя 2019 13:14

В обеих функциях используется возвращаемый параметр HRESULT* ResultCode:

Код: Выделить всё

    HRESULT CreateQueue(
                    [out] SLMSErrorCode* ErrorCode, 
                    [out] HRESULT* ResultCode, 
                    [in] BSTR Name, 
                    [in] long NotifyHwnd, 
                    [in] long NotifyCmd, 
                    [in] long NotifyWParam, 
                    [in] long NotifyLParam, 
                    [out] IUnknown** retQueue);

Код: Выделить всё

    HRESULT SendMessage(
                    [out] SLMSErrorCode* ErrorCode, 
                    [out] HRESULT* ResultCode, 
                    [in] long MessId, 
                    [in] long ReplyTo, 
                    [in] BSTR ToMachine, 
                    [in] BSTR ToQueue, 
                    [in] BSTR Subject, 
                    [in] BSTR Body);                   
Возможно ругается на него.

Честно говоря, я не подскажу, как решить эту проблему. У меня было только замечание про NotifyHwnd - в Вашем случае его нужно устанавливать в ноль, поскольку в обработчике сообщений окна нет обработки сообщения NotifyCmd.

AlMaz
Сообщения: 65
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz » 21 ноя 2019 15:32

HRESULT используется и в работающем методе GetName. Так что думаю дело не в нем.
HRESULT GetName([out] BSTR* Name) – возвращает имя текущей машины.

1) А какова разрядность и границы типа long в языке на котом компилируете dll-ку?
это unsigned long int в границах От 0 до 4 294 967 295?
Неполноценный VBA unsigned-типы не узнает и пока я не понимаю как заставить его это сделать.
Видимо сделаю программу-прокладку которая будет ловить в свое окно сообщения от экселя и уже передавать в OnAir =)

2) возможно ли сделать в SLMessageServer дополнительные методы CreateQueue/SendMessage с использованием известного VBA типа целого
Long - Хранение целых чисел от -2147483648 до 2147483647.
Допустим с выдачей ошибки при посылке отрицательного значения параметра?
В принципе достаточно было бы только аналога для SendMessage, мне надо только отправлять команды в OnAir =)

Игорь Таранцев
Сообщения: 489
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев » 22 ноя 2019 13:22

HRESULT это long, то есть число в пределах от -2147483648 до 2147483647. Однако ошибка говорит, что неизвестный тип. Может быть, что результат работы любого COm-вызова умеет обрабатываться интерпретатором VB, а вот создать переменную такого типа он не может (не прописан соответствующий код для распознавания типа "HRESULT". Но это чисто мое предположение и в целом безрезультатно обсуждать эту тему - все равно мы ничего исправить в интерпретаторе не сможем. Поэтому сразу перейду ко второму предложению:
2) возможно ли сделать в SLMessageServer дополнительные методы CreateQueue/SendMessage с использованием известного VBA типа целого
Long - Хранение целых чисел от -2147483648 до 2147483647.
Допустим с выдачей ошибки при посылке отрицательного значения параметра?
В принципе достаточно было бы только аналога для SendMessage, мне надо только отправлять команды в OnAir =)
Считаю, что создавать очередь совершенно бессмысленно, если нужно просто отправить сообщение. Так что остается метод "SendMessage". У него все параметры, кроме первых двух, гарантированно "нормальные". Первые два параметра возвращают результат операции (получилось доставить сообщение или нет). Соответственно, главный вопрос - Вам нужно получать информацию о проблемах с доставкой/выполнением команды? Этот вопрос не праздный. Во-первых, есть многие команды, которые "молча" уходят к клиенту и посылают в ответ другие команды. Во-вторых, логика отправки команд через MessageServer такова - при вызове метода SendMessage команда с параметрами ставится в локальную очередь сервера и все. Затем, асинхронно, сервер передает команду другому серверу. Затем другой сервер передает команду во входную очередь клиента. И только затем клиент исполняет эту команду. На любом этапе может случиться проблема и в отчет полетит извещение, что команда с таким-то ID на таком-то этапе не была доставлена по такой-то причине. Если нет окна для приема такого сообщения (а у Вас его очевидно нет - ведь сообщение в окно Excel-я точно не будет обработано как нам нужно), то зачем вообще получить ответ? Но работа без ответа сильно ограничивает круг возможностей по управлению OnAir_ом и возникает вопрос - а зачем тогда MessageServer? почему не использовать GPI API, оно как раз для посылки очень простых команд (без параметров).

AlMaz
Сообщения: 65
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz » 22 ноя 2019 14:11

Спасибо за совет, гляну GPI API. В каком из руководств поискать от том как можно их отправлять из своего ПО, пока нашел только об отправке их из OnAir в FDCapture.
О результате напишу позже.
Мне на самом деле сейчас необходимо только включать-выключать заданные титры.

Людмила
Сообщения: 1367
Зарегистрирован: 10 сен 2004 12:09

Re: SLMessageServer и VB Excel 2010

Сообщение Людмила » 25 ноя 2019 14:06

гляну GPI API. В каком из руководств поискать от том как можно их отправлять из своего ПО
Просьба прислать запрос в отдел технической поддержки
forward@softlab.tv
forward@sl.iae.nsk.su
со ссылкой на это сообщение в форуме.

Игорь Таранцев
Сообщения: 489
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев » 28 ноя 2019 10:39

SDK отправили. Для взаимодействия Вашей программы с OnAir нужно пользоваться SoftGPI
http://softlab.tv/rus/forward/docs/ru_t ... pisoft.pdf

Ответить