Пишем свою оболочку для FP под Windows. Шаг 3.
Загрузка swf из ресурсов.
Включаем construct.swf в ресурсы приложеения.
В директорию проекта (рядом с test.vcproj) положим Construct.swf. Если в название другое, внесите соответственно правки.
Компилируем (F7). Все гладко? Ок. Вообще, настоятельно рекомендую в Resource.h располагать дефайны по-возрастающей.
Как нам его загрузить в плеер? LoadMovie() понимает только физический путь к файлу на диске или в сети. А как из памяти загрузить? Для этого у плеера есть интерфейс IPersistStreamInit. Не буду тянуть за хвост резину:
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() с последующим CopyMemory() – это предтеча для CreateStreamOnHGlobal(). Во-вторых, получив указатель на IPersistStreamInit плеера, мы просто используем один из его методов Load(), подставив memory stream параметром. В-третьих, и это самое загадочное:
Ну, вторую строчку еще можно осмыслить – просто в начало стрима пишем размер swf-данных, логично, вобщем-то. А вот зачем в самую голову стрима писать 0x55665566?
Если кто вразумительно ответит на этот вопрос, получит пирожок . Наверняка, кто-то что-то про это слышал. За себя скажу, что эти байты, видимо, о чем-то «говорят» плееру, о чем-то важном.. Возможно, о характере загружаемого контента.
Использование:
Что-то на сей раз кратенько вышло). Потому дополню один занятный факт.
Вот так – работает:
И вот так – работает!)
Если инициализировать контрол по-другому, т.е. не из ресурсов, работает только первый вариант. Выходит, можно заранее «приготовить» таким образом плеер с мувом и потом его уже пользовать. О как.
Ну вот, фактически, мы имеем уже аналог стандартного флеш-проектора: плеер вшит, ролик вшит, полная автономия! Для разнообразия в тестовом проекте я зашил два ролика в ресурсы.
Но мы пойдем дальше, и на следующем шаге задействуем TRANSPARENT MODE плеера. Для того я, собственно, и припас Construct.swf.
Всего комментариев 6
Комментарии
17.06.2011 18:46 | |
А мне где-то попадались еще.. типа "кратинка в буфере", но уточнять не возьмусь, так.. мелькнуло где-то.
Все, что нужно с практической точки зрения - это описано в параметрах эмбеда контрола в хтмл, тут где-то ссылку я выкладывал. Остальное я пробовал и так и сяк крутить - малоинтересно, частности. Я имею в виду, для десктоп-приложения оно ни к чему, вобщем-то. Часть всего этог нужна для управления воспроизведением ролика, который вообще никикх скриптов не содержит, т.е. просто анимация на таймлайне рисованная и все. |
|
Обновил(-а) alexcon314 17.06.2011 в 19:06
|
19.06.2011 00:33 | |
Цитата:
Спросил потому как не работает set/getVariable(), поскольку в примерах что я видел не указано какие ограничения наложены на переменную внутри флешки, ведь не дала бы макромедия возможность менять любую переменную в ролике ?..
Цитата:
Как мне кажется, для достойного плеера, необходимо все функции самого плеера оставлять загружаемой флешке, а она в свою очередь будет загружать другую, необходимую для показа.
Цитата:
Я не думаю что удасться отказаться от официального компонента, тк его реализация мне представляется очень сложной.
А еще есть расширение проектора, если что. Там компонент как таковой вообще не нужен. |
Последние записи от alexcon314
- Пишем свою оболочку для FP под Windows. Шаг 6. (19.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 5. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 4. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 3. (18.05.2011)
- Пишем свою оболочку для FP под Windows. Шаг 2. (17.05.2011)