SLMessageServer и VB Excel 2010
Модераторы: Людмила, PR, vd, Даниленко Сергей
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
SLMessageServer и VB Excel 2010
Добрый день. Возникла разовая задача, требующая сделать в Экселе кнопки запускающие/убирающие титровальные объекты.
Почитал документацию по 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.
Файлик со скриптом могу отдать для теста, там все только в начальной стадии работы.
Почитал документацию по 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?
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Re: SLMessageServer и VB Excel 2010
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 даже при попытке вызова метода без параметров, сразу выдает эту ошибку. Т.е. скорее всего на этапе проверки типов данных передаваемых методу.
Дело скорее всего точно не в нем, ведь в
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:
Возможно ругается на него.
Честно говоря, я не подскажу, как решить эту проблему. У меня было только замечание про NotifyHwnd - в Вашем случае его нужно устанавливать в ноль, поскольку в обработчике сообщений окна нет обработки сообщения NotifyCmd.
Код: Выделить всё
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.
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Re: SLMessageServer и VB Excel 2010
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 =)
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". Но это чисто мое предположение и в целом безрезультатно обсуждать эту тему - все равно мы ничего исправить в интерпретаторе не сможем. Поэтому сразу перейду ко второму предложению:
Считаю, что создавать очередь совершенно бессмысленно, если нужно просто отправить сообщение. Так что остается метод "SendMessage". У него все параметры, кроме первых двух, гарантированно "нормальные". Первые два параметра возвращают результат операции (получилось доставить сообщение или нет). Соответственно, главный вопрос - Вам нужно получать информацию о проблемах с доставкой/выполнением команды? Этот вопрос не праздный. Во-первых, есть многие команды, которые "молча" уходят к клиенту и посылают в ответ другие команды. Во-вторых, логика отправки команд через MessageServer такова - при вызове метода SendMessage команда с параметрами ставится в локальную очередь сервера и все. Затем, асинхронно, сервер передает команду другому серверу. Затем другой сервер передает команду во входную очередь клиента. И только затем клиент исполняет эту команду. На любом этапе может случиться проблема и в отчет полетит извещение, что команда с таким-то ID на таком-то этапе не была доставлена по такой-то причине. Если нет окна для приема такого сообщения (а у Вас его очевидно нет - ведь сообщение в окно Excel-я точно не будет обработано как нам нужно), то зачем вообще получить ответ? Но работа без ответа сильно ограничивает круг возможностей по управлению OnAir_ом и возникает вопрос - а зачем тогда MessageServer? почему не использовать GPI API, оно как раз для посылки очень простых команд (без параметров).2) возможно ли сделать в SLMessageServer дополнительные методы CreateQueue/SendMessage с использованием известного VBA типа целого
Long - Хранение целых чисел от -2147483648 до 2147483647.
Допустим с выдачей ошибки при посылке отрицательного значения параметра?
В принципе достаточно было бы только аналога для SendMessage, мне надо только отправлять команды в OnAir =)
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Re: SLMessageServer и VB Excel 2010
Спасибо за совет, гляну 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
http://softlab.tv/rus/forward/docs/ru_t ... pisoft.pdf
-
- Сообщения: 76
- Зарегистрирован: 02 июн 2010 12:48
- Откуда: Красноярск, Прима-ТВ
- Контактная информация:
Re: SLMessageServer и VB Excel 2010
Огромное спасибо за советы и документацию. Быстро получили ее. Все просто и понятно описано. Решил поделиться результатом.
Была задача:
Для клиента провести розыгрыш призов в прямом эфире. С использованием фирменных цветов. Разворачивать подложку, показывать шарики, показывать победителя.
Клиент предоставлял нам список в Экселе участников: Номер, Фио, Телефон.
Один раз у нас уже было подобное, там все делалось руками в Экселе, несколькими людьми. Прямой эфир, спешка, нервы, жуть-жуткая. И особой красоты, соответственно было не добиться.
Сейчас программа на 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
Была задача:
Для клиента провести розыгрыш призов в прямом эфире. С использованием фирменных цветов. Разворачивать подложку, показывать шарики, показывать победителя.
Клиент предоставлял нам список в Экселе участников: Номер, Фио, Телефон.
Один раз у нас уже было подобное, там все делалось руками в Экселе, несколькими людьми. Прямой эфир, спешка, нервы, жуть-жуткая. И особой красоты, соответственно было не добиться.
Сейчас программа на 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