SLMessageServer и VB Excel 2010

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

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

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

SLMessageServer и VB Excel 2010

Сообщение AlMaz »

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

Почитал документацию по 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.

Файлик со скриптом могу отдать для теста, там все только в начальной стадии работы.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев »

А что Вы подставляете в качестве параметра gl_OnAir_NotifyHwnd?
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz »

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 даже при попытке вызова метода без параметров, сразу выдает эту ошибку. Т.е. скорее всего на этапе проверки типов данных передаваемых методу.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев »

В обеих функциях используется возвращаемый параметр 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
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz »

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 =)
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев »

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
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz »

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

Re: SLMessageServer и VB Excel 2010

Сообщение Людмила »

гляну GPI API. В каком из руководств поискать от том как можно их отправлять из своего ПО
Просьба прислать запрос в отдел технической поддержки
forward@softlab.tv
forward@sl.iae.nsk.su
со ссылкой на это сообщение в форуме.
Игорь Таранцев
Сообщения: 493
Зарегистрирован: 04 янв 2004 12:45
Откуда: СофтЛаб-НСК

Re: SLMessageServer и VB Excel 2010

Сообщение Игорь Таранцев »

SDK отправили. Для взаимодействия Вашей программы с OnAir нужно пользоваться SoftGPI
http://softlab.tv/rus/forward/docs/ru_t ... pisoft.pdf
AlMaz
Сообщения: 76
Зарегистрирован: 02 июн 2010 12:48
Откуда: Красноярск, Прима-ТВ
Контактная информация:

Re: SLMessageServer и VB Excel 2010

Сообщение AlMaz »

Огромное спасибо за советы и документацию. Быстро получили ее. Все просто и понятно описано. Решил поделиться результатом.
Была задача:

Для клиента провести розыгрыш призов в прямом эфире. С использованием фирменных цветов. Разворачивать подложку, показывать шарики, показывать победителя.
Клиент предоставлял нам список в Экселе участников: Номер, Фио, Телефон.
Один раз у нас уже было подобное, там все делалось руками в Экселе, несколькими людьми. Прямой эфир, спешка, нервы, жуть-жуткая. И особой красоты, соответственно было не добиться.

Сейчас программа на Delphi, делала большую часть работы.
Ведущий доставал шарик, оператор отправлял на OnAir, какой проект запустить/убрать с новым заданием и выдавал очередной шарик в эфир на подложку.
Сразу вычислялось сколько в следующем этапе должно быть шаров в корзине (для ведущего). Так как нумерация билетов не всегда была сквозная и не все цифры использовались в очередном разряде билета. И сколько осталось кандидатов на приз, сообщали это ведущему .

Вытаскивали из корзины шарики, пока не попадали на играющий и шли к следующей корзине. В итоге получали номер победителя. И через ПО тут же выводили на экран с затиранием части: ФИО + телефон

Это все шло 4 недели каждую пятницу. За 15-20 минут разыгрывали 10 выигрышей, при этом еще звонили победителям в прямом эфире сразу..
Кто делал - представит какая это скорость в эфире для выдающей команды.

Клиент остался очень доволен. Спасибо вам за ваши разработки, за огромное количество возможностей в них!

То что было в эфире на экране в итоге
https://cloud.mail.ru/public/39Md/5fz35ePnq
https://cloud.mail.ru/public/4Zvh/2tLvRv8uH

А вот так это выглядит со стороны выпускающего
https://cloud.mail.ru/public/4bap/5bHry3sxp
Последний раз редактировалось AlMaz 08 апр 2020 13:20, всего редактировалось 3 раза.
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Re: SLMessageServer и VB Excel 2010

Сообщение Даниленко Сергей »

Отличная работа!
Даниленко Сергей
Сообщения: 7091
Зарегистрирован: 26 фев 2004 09:53
Откуда: Techsupport SoftLab-NSK

Re: SLMessageServer и VB Excel 2010

Сообщение Даниленко Сергей »

Заметка в нашем блоге: https://forwardsl.blogspot.com/2020/04/blog-post_9.html
Ответить