Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Блоги > alexcon314

Оценить эту запись

Пишем свою оболочку для FP под Windows. Шаг 3.

Запись от alexcon314 размещена 18.05.2011 в 00:39
Обновил(-а) alexcon314 18.05.2011 в 00:43

Загрузка swf из ресурсов.

Включаем construct.swf в ресурсы приложеения.
Код AS3:
//  test.rc 
ID_SWF   BIN "Construct.swf" 
// Resource.h
#define ID_SWF	500
В директорию проекта (рядом с test.vcproj) положим Construct.swf. Если в название другое, внесите соответственно правки.

Компилируем (F7). Все гладко? Ок. Вообще, настоятельно рекомендую в Resource.h располагать дефайны по-возрастающей.
Как нам его загрузить в плеер? LoadMovie() понимает только физический путь к файлу на диске или в сети. А как из памяти загрузить? Для этого у плеера есть интерфейс IPersistStreamInit. Не буду тянуть за хвост резину:
Код AS3:
HRESULT CFlashWnd::LoadMovie(UINT id, WCHAR* resType)
{
	if(hInst == NULL)
		return S_FALSE;
 
	if(isMovieLoaded == TRUE)
		return S_FALSE;
 
	HRSRC hResInfo = ::FindResource(hInst, MAKEINTRESOURCE(id), resType);
	if(!hResInfo)
		return S_FALSE;
 
	HRSRC hResource = ::FindResource(hInst, MAKEINTRESOURCE(id), resType);
	if(!hResource)
		return S_FALSE;
 
	HGLOBAL hResourceData = ::LoadResource(hInst, hResource);
	if(!hResourceData)
		return S_FALSE;
 
	LPVOID lpResourceData = ::LockResource(hResourceData);
	if(!lpResourceData)
		return S_FALSE;
 
	DWORD dwResourceSize = ::SizeofResource(hInst, hResource);
	if(dwResourceSize == 0)
		return S_FALSE;
 
	HGLOBAL hGlobalData = ::GlobalAlloc(GPTR, dwResourceSize+8);
	if(!hGlobalData)
		return S_FALSE;
 
	LPBYTE pMem = (LPBYTE)::GlobalLock(hGlobalData);
	if(!pMem)
		return S_FALSE;
 
	((long*)pMem)[0] = 0x55665566; 
	((long*)pMem)[1] = dwResourceSize;
	::CopyMemory((void*)(&(pMem[8])), lpResourceData, dwResourceSize);
	IStream* pStream = 0;
	HRESULT hr = ::CreateStreamOnHGlobal(hGlobalData, TRUE, &pStream);
	if(hr == S_OK)
	{
		IPersistStreamInit* pPersistStream = NULL;
		hr = flash->QueryInterface(IID_IPersistStreamInit, (void**)&pPersistStream);
		if(hr == S_OK)
			hr = pPersistStream->Load(pStream);
		pPersistStream->Release();
		pPersistStream = NULL;
		pStream->Release();
		pStream = NULL;
	}
	::GlobalUnlock((HGLOBAL)pMem);
	isMovieLoaded = TRUE;
	return hr;
 
}
До GlobalAlloc() сценарий точно такой же как и в случае загрузки контрола из ресурсов.
А вот далее начинается нечто интересное. Во-первых, GlobalAlloc() с последующим CopyMemory() – это предтеча для CreateStreamOnHGlobal(). Во-вторых, получив указатель на IPersistStreamInit плеера, мы просто используем один из его методов Load(), подставив memory stream параметром. В-третьих, и это самое загадочное:
Код AS3:
 ((long*)pMem)[0] = 0x55665566; 
((long*)pMem)[1] = dwResourceSize;
Ну, вторую строчку еще можно осмыслить – просто в начало стрима пишем размер swf-данных, логично, вобщем-то. А вот зачем в самую голову стрима писать 0x55665566?
Если кто вразумительно ответит на этот вопрос, получит пирожок . Наверняка, кто-то что-то про это слышал. За себя скажу, что эти байты, видимо, о чем-то «говорят» плееру, о чем-то важном.. Возможно, о характере загружаемого контента.

Использование:
Код AS3:
LoadMovie(ID_SWF,L"BIN");
Что-то на сей раз кратенько вышло). Потому дополню один занятный факт.
Вот так – работает:
Код AS3:
CreateInstance(ID_OCX,L"BIN");
AttachControl();
LoadMovie(ID_SWF,L"BIN");
И вот так – работает!)
Код AS3:
CreateInstance(ID_OCX,L"BIN");
LoadMovie(ID_SWF,L"BIN");
AttachControl();
Если инициализировать контрол по-другому, т.е. не из ресурсов, работает только первый вариант. Выходит, можно заранее «приготовить» таким образом плеер с мувом и потом его уже пользовать. О как.

Ну вот, фактически, мы имеем уже аналог стандартного флеш-проектора: плеер вшит, ролик вшит, полная автономия! Для разнообразия в тестовом проекте я зашил два ролика в ресурсы.
Но мы пойдем дальше, и на следующем шаге задействуем TRANSPARENT MODE плеера. Для того я, собственно, и припас Construct.swf.
Вложения
Тип файла: zip test3.zip (59.8 Кб, 240 просмотров)
Всего комментариев 6

Комментарии

Старый 08.06.2011 17:04 S-ed вне форума
S-ed
 
Аватар для S-ed
fUfU - говорит, что флешка успешно загружена в буфер

Незнаю зачем это было сделано, но при чтении потока он проверяется на валидность по первым 4м байтам.

Я ничего не перепутал? (доков по этой теме не нашел, видел чтолько примеры кодов и на w3s чел-к говорил для чего это)
Старый 08.06.2011 22:38 alexcon314 вне форума
alexcon314
Я встречал другие "рабочие" сигнатуры в блогах и в форумных постах. Сейчас как бы не нафиг искать и пробовать и т.д.. Интуиция говорит - забей. Нечего тут рыть. Это такая фича, имхо. Вывел для себя - это признак контента. Возможно, просто атавизм с очень ранних плееров.. Но, фуфу - "меня на фуфу не возьмешь!" - это сильно!). Индусы, говорите, е-маё..
Возьмусь за плугин, надеюсь, будет что сравнить.
ЗЫ. Спасиб за инфу, как ни как.
Старый 17.06.2011 14:45 S-ed вне форума
S-ed
 
Аватар для S-ed
Я знаю только 2: fUfU, gUfU =)
Первая - все ок, работаем.
Вторая - буфер пуст.

А не подскажете где почитать про COM flash*.ocx? Не смог найти описание методов AxShockwaveFlash. Тоесть те, что интуитивно понятны, я пользую, а вот что есть - StopPlay()? =)
Старый 17.06.2011 18:46 alexcon314 вне форума
alexcon314
А мне где-то попадались еще.. типа "кратинка в буфере", но уточнять не возьмусь, так.. мелькнуло где-то.
Все, что нужно с практической точки зрения - это описано в параметрах эмбеда контрола в хтмл, тут где-то ссылку я выкладывал. Остальное я пробовал и так и сяк крутить - малоинтересно, частности. Я имею в виду, для десктоп-приложения оно ни к чему, вобщем-то. Часть всего этог нужна для управления воспроизведением ролика, который вообще никикх скриптов не содержит, т.е. просто анимация на таймлайне рисованная и все.
Обновил(-а) alexcon314 17.06.2011 в 19:06
Старый 18.06.2011 16:19 S-ed вне форума
S-ed
 
Аватар для S-ed
Я с программером пытаюсь прикрутить флеш как GUI интерфейс к программе.
В основном все делается через ExternalInterface. Спросил потому как не работает set/getVariable(), поскольку в примерах что я видел не указано какие ограничения наложены на переменную внутри флешки, ведь не дала бы макромедия возможность менять любую переменную в ролике ?..

Как мне кажется, для достойного плеера, необходимо все функции самого плеера оставлять загружаемой флешке, а она в свою очередь будет загружать другую, необходимую для показа.
Я не думаю что удасться отказаться от официального компонента, тк его реализация мне представляется очень сложной.
Старый 19.06.2011 00:33 alexcon314 вне форума
alexcon314
Цитата:
Спросил потому как не работает set/getVariable(), поскольку в примерах что я видел не указано какие ограничения наложены на переменную внутри флешки, ведь не дала бы макромедия возможность менять любую переменную в ролике ?..
Это вопрос? Тогда не ясно, что именно интересует. Get/SetVariable не работает для AS3-роликов, только и всего. Рудимент. Для AS2 все по-прежнему работает. Собственно, ExternalInterface освойте, более ничего вам и не потребуется, вобщем-то, да и нету больше ничего такого штатного. Ну сокеты еще... но это не то. Из нештатного кроме ExternalInterface есть еще кое-что не менее приятное, посмотрите Шаг 6.
Цитата:
Как мне кажется, для достойного плеера, необходимо все функции самого плеера оставлять загружаемой флешке, а она в свою очередь будет загружать другую, необходимую для показа.
Именно. Наподобие известных плееров что-то (ютуб, там.. мп3-хи и т.п.). Т.е. некий АПИ, грузим свой ролик, и к нему цепляемся. Что-то подобное имеет место быть у MDM Zinc, кстати. Хорошая мысль, тянет именно на звание "движок".
Цитата:
Я не думаю что удасться отказаться от официального компонента, тк его реализация мне представляется очень сложной.
Зачем от него отказываться? Что мешает его использовать? Ну, за собственную реализацию плеера молчу. тут с нуля на годы можно увязнуть.
А еще есть расширение проектора, если что. Там компонент как таковой вообще не нужен.
 

 


Часовой пояс GMT +4, время: 12:49.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.