Автоматизация выхода титровальных объектов (текст+подложка)
Модераторы: Людмила, PR, vd, Даниленко Сергей
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
Я сделал и с добавлением строки и с импортом ДДЛ, теперь при запуске всё останавливается на строке TitleManager->Init(project, 0, &guidTitleTarget); и говорит "Project Project1.exe raised exception class EAccessViolation with message "Access violation at address 00401B3B in module 'Project1.exe'. Read of address 00000000'
Вот сижу и думаю что бы это значило.
Вот сижу и думаю что бы это значило.
-
- Сообщения: 11
- Зарегистрирован: 15 дек 2003 12:51
- Откуда: Softlab-Nsk
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
Хм, поставил вместо CLSID_SLTMTitleServerTargetMgr CLSID_TitleProjectMgr, затем имя файла сделал несуществующего-в обоих случиях ничего в ошибке не поменялось.
Тут ещё одна вещь-если я ставлю BSTR project = SysAllocString("D:\BS\MUZ.SLTitleProj");, то выдает ошибку: [C++ Error] Unit1.cpp(27): E2034 Cannot convert 'char *' to 'const wchar_t *'
[C++ Error] Unit1.cpp(27): E2340 Type mismatch in parameter 1 (wanted 'const wchar_t *', got 'char *'). Когда я просто пишу TitleManager->Init( (BSTR) "D:\BS\MUZ.SLTitleProj", 0, &guidTitleTarget); , то вроде запускается и уже ругается ошибкой, которую я выше написал. Большая ли разница в этом самом (BSTR) "D:\BS\MUZ.SLTitleProj" ? Так можно делать? Может быть это всё из-за этого?
Тут ещё одна вещь-если я ставлю BSTR project = SysAllocString("D:\BS\MUZ.SLTitleProj");, то выдает ошибку: [C++ Error] Unit1.cpp(27): E2034 Cannot convert 'char *' to 'const wchar_t *'
[C++ Error] Unit1.cpp(27): E2340 Type mismatch in parameter 1 (wanted 'const wchar_t *', got 'char *'). Когда я просто пишу TitleManager->Init( (BSTR) "D:\BS\MUZ.SLTitleProj", 0, &guidTitleTarget); , то вроде запускается и уже ругается ошибкой, которую я выше написал. Большая ли разница в этом самом (BSTR) "D:\BS\MUZ.SLTitleProj" ? Так можно делать? Может быть это всё из-за этого?
-
- Сообщения: 2311
- Зарегистрирован: 05 мар 2003 19:21
Так делать нельзя. Почитайте про работу с BSTR. Такую строку нужно правильно выделять в памяти. Если в вашем Builder поддерживается ATL, то в ней должен быть класс CComBSTR - нужно пользоваться им, например:Когда я просто пишу TitleManager->Init( (BSTR) "D:\BS\MUZ.SLTitleProj"
CComBSTR bstrProj("D:\BS\MUZ.SLTitleProj");
и далее передавать в Init указатель на переменную bstrProj.
Если же ATL у вас нет, то нужно именно выделять строку, а только потом ее передавать. Почему у вас компилятор ругается - не знаю. У нас на 6-м Builder никто не пишет, только на MS Visual Studio, так что помочь вам несколько затруднительно.
Могу лишь предположить, что в SysAllocString нужно передавать OLE-строку (юникодную), а вы пытаетесь передать обычную (ANSI). Преобразуйте строку сначала в Wide Char, а потом передавайте.
В VisualStudio для этого строку достаточно окружить макросом TEXT("string") или _T("string"), или просто перед первой кавычкой добавить L"string". Надеюсь, что какая-то из этих конструкций должна сработать и в Builder.
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
Доброе время суток.
Опять у меня вопрос. Из моей программки вывод заработал, включать/выключать воспроизведение титровальных элементов получается...но ОнАир выключать запущенные из моего приложения титры не может. А мне ж нужно чтобы включением и выключением титров управлял ОнАир(ведь именно там загружено расписание рекламных окон во время которых нельзя гнать титры). Как можно получить состояние ОнАира? Точней нужно чтобы он мне сообщал когда надо выключить титры по его расписанию. И было б ещё очень хорошо, чтобы говорил время до конца передачи, где титры разрешены(т.е. до начала рекламы осталось столько -то).
Опять у меня вопрос. Из моей программки вывод заработал, включать/выключать воспроизведение титровальных элементов получается...но ОнАир выключать запущенные из моего приложения титры не может. А мне ж нужно чтобы включением и выключением титров управлял ОнАир(ведь именно там загружено расписание рекламных окон во время которых нельзя гнать титры). Как можно получить состояние ОнАира? Точней нужно чтобы он мне сообщал когда надо выключить титры по его расписанию. И было б ещё очень хорошо, чтобы говорил время до конца передачи, где титры разрешены(т.е. до начала рекламы осталось столько -то).
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
В нашем SDK есть документ, описывающий как можно получать требуемую информацию из программы OnAir.
SDK можно взять здесь:
http://www.softlab-nsk.com/rus/forward/ ... areSDK.zip
Вам нужны следующие документы:
...\Other\OnAirExternalTaskMsg.doc
...\Other\OnAirTitleMessages.txt
SDK можно взять здесь:
http://www.softlab-nsk.com/rus/forward/ ... areSDK.zip
Вам нужны следующие документы:
...\Other\OnAirExternalTaskMsg.doc
...\Other\OnAirTitleMessages.txt
-
- Сообщения: 2311
- Зарегистрирован: 05 мар 2003 19:21
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
День добрый.
Попытался я сделать что-нибудь путное с OnAirExternalTaskMsg.doc, OnAirTitleMessages.txt ...что-то получилось, но мне не нравится. Во - первых я не понял содержимое OnAirTitleMessages.txt
А из OnAirExternalTaskMsg.doc сделал вот что: висит второй он-аир, в нем расписание вида:
wait follow 0
waitshout raz_dva_tri
titleObjLoad {TitleObject} 0:00:00.96 d:\bs\tochka.txt
repeat script
Когда включены титры в ОнАире, то расписание мне через каждую секунду стукается в мою прогу и она знает, что титры можно пускать, если секунду с половиной нет этого запроса, то титры выключаются. Вроде работает(уже даже это дело в эфире запустил), но есть недостатки всего этого: 1) все равно запускать два онАира, 2) внизу экрана пробегает маленькая точка(tochka.txt), хотя её практически ни один телек не показывает 3) сработка ТитрамСтоп в моей проге происходит с задержкой(почти в 2 секунды).
Как бы это все-таки по-лучше сделать? (без второго ОнАира и вообще без всех этих выкрутасов) Просто чтобы шел в ОнАир запрос из моей проги, а он бы отвечал(титры вкл или нет) и как можно чаще(чтобы срабатка выкления титров была быстрей).
Попытался я сделать что-нибудь путное с OnAirExternalTaskMsg.doc, OnAirTitleMessages.txt ...что-то получилось, но мне не нравится. Во - первых я не понял содержимое OnAirTitleMessages.txt
А из OnAirExternalTaskMsg.doc сделал вот что: висит второй он-аир, в нем расписание вида:
wait follow 0
waitshout raz_dva_tri
titleObjLoad {TitleObject} 0:00:00.96 d:\bs\tochka.txt
repeat script
Когда включены титры в ОнАире, то расписание мне через каждую секунду стукается в мою прогу и она знает, что титры можно пускать, если секунду с половиной нет этого запроса, то титры выключаются. Вроде работает(уже даже это дело в эфире запустил), но есть недостатки всего этого: 1) все равно запускать два онАира, 2) внизу экрана пробегает маленькая точка(tochka.txt), хотя её практически ни один телек не показывает 3) сработка ТитрамСтоп в моей проге происходит с задержкой(почти в 2 секунды).
Как бы это все-таки по-лучше сделать? (без второго ОнАира и вообще без всех этих выкрутасов) Просто чтобы шел в ОнАир запрос из моей проги, а он бы отвечал(титры вкл или нет) и как можно чаще(чтобы срабатка выкления титров была быстрей).
-
- Сообщения: 11
- Зарегистрирован: 15 дек 2003 12:51
- Откуда: Softlab-Nsk
Поскольку ваша программа уже ловит сообщения shoot/waitshoot, то вам нужно доработать ее совсем немного.
OnAirTitleMessages.txt:
Предположим, вы работаете на третьей плате.
При старте программы вы один раз перебираете все top-level окошки с классом TForwardMessager и вызываете
PostMessage(hwnd,WM_USER,0x10200,0);
0x10200 = FrwMsgAirTitling+(2<<8)+amAsk
Получив это сообщение, а также при любых изменениях текущих параметров логотипа/титров на данной плате, FDOnAir посылает всем сообщения об этих параметрах.
Ваша программа, получив сообщение WM_USER, должна проверить,
что это титровальное сообщение:
WPARAM & 0xffff0000 == FrwMsgAirTitling,
и что это сообщение относится к вашей плате:
(WPARAM>>8) & 0xff == 2.
После этого код (WPARAM & 0xff) определяет значение величины в LPARAM.
amLogo(1) - LPARAM = текущее значение Logo
amTitle(2) - LPARAM = текущее значение Title
amTime(3) - LPARAM = через сколько миллисекунд в расписании будет TitleOff. 0 - означает отсутствие ограничений.
OnAirTitleMessages.txt:
BoardIndex всегда на единицу меньше номера платы.#define FrwMsgAirTitling (1<<16)
WPARAM = FrwMsgAirTitling+(BoardIndex<<8)+cmd
enum cmd {amAsk,amLogo,amTitle,amTime};
amAsk - запущенная задача шлет эту команду, чтобы кто-нибудь сообщил ей текущие значения Logo и Title.
amLogo - сообщает LPARAM = Logo
amTitle - сообщает LPARAM = Title
amTime - сообщает LPARAM = Time, (решено) через сколько миллисекунд в расписании будет TitleOff.
Time == 0 - означает отсутствие ограничений.
Предположим, вы работаете на третьей плате.
При старте программы вы один раз перебираете все top-level окошки с классом TForwardMessager и вызываете
PostMessage(hwnd,WM_USER,0x10200,0);
0x10200 = FrwMsgAirTitling+(2<<8)+amAsk
Получив это сообщение, а также при любых изменениях текущих параметров логотипа/титров на данной плате, FDOnAir посылает всем сообщения об этих параметрах.
Ваша программа, получив сообщение WM_USER, должна проверить,
что это титровальное сообщение:
WPARAM & 0xffff0000 == FrwMsgAirTitling,
и что это сообщение относится к вашей плате:
(WPARAM>>8) & 0xff == 2.
После этого код (WPARAM & 0xff) определяет значение величины в LPARAM.
amLogo(1) - LPARAM = текущее значение Logo
amTitle(2) - LPARAM = текущее значение Title
amTime(3) - LPARAM = через сколько миллисекунд в расписании будет TitleOff. 0 - означает отсутствие ограничений.
-
- Сообщения: 168
- Зарегистрирован: 16 окт 2005 03:02
- Откуда: г.Туапсе
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
-
- Сообщения: 92
- Зарегистрирован: 05 фев 2009 17:40
- Откуда: севастополь
- Контактная информация:
-
- Сообщения: 7091
- Зарегистрирован: 26 фев 2004 09:53
- Откуда: Techsupport SoftLab-NSK
-
- Сообщения: 92
- Зарегистрирован: 05 фев 2009 17:40
- Откуда: севастополь
- Контактная информация: