فلاش ActiveX:كيفية تحميل الفيلم من الذاكرة أو الموارد أو تيار ؟

StackOverflow https://stackoverflow.com/questions/423166

سؤال

أنا تضمين فلاش تحكم ActiveX في C++ التطبيق (فلاش.ocx ، Flash10a.ocx ، وما إلى ذلك اعتمادا على الإصدار فلاش).

لا يمكن تحميل ملف SWF من خلال الاتصال LoadMovie(0, filename) ولكن الملف يحتاج فعليا في القرص.كيفية تحميل SWF من الذاكرة (أو الموارد أو تيار)?أنا متأكد من يجب أن يكون هناك طريقة لأن الحلول التجارية مثل و في صندوق's ميزة تحميل أفلام فلاش من الذاكرة مباشرة كما يستخدم فلاش تحكم ActiveX.

هل كانت مفيدة؟

المحلول

Appearantly أنا سوف تحتاج إلى تقديم تفاصيل عن تصويت 'حتى'..موافق.

الداخلية فلاش العازلة عند أول initiailized يشير إلى ما إذا كان تحميل فيلم أو إذا كان المخزن المؤقت اضغط خصائص في المخزن المؤقت fisrt أربعة بايت.

gUfU-أي فيلم تحميل.خصائص لمتابعة ....

fUfU -- ..[4بايت] حجم عدد صحيح.

ثم مضغوط فيلم أو SWF كما كان.كتابة IStream الدرجة.ملء مع أعلاه.حفظ باسم szFile

TFlashStream *fStream = new TFlashStream(szFile);
// QI flash player

IPersistStreamInit * psStreamInit = 0;
shock->QueryInterface(::IID_IPersistStreamInit,  
                     (LPVOID*)&psStreamInit);
if(psStreamInit)
{
    psStreamInit->InitNew();
    psStreamInit->Load(fStream);
    psStreamInit->Release();
}
delete fStream;

الأشياء ملاحظة :عندما psStreamInit->تحميل(fStream);سوف ندعو IStream::قراءة تبحث عن رأس 'fUfU'.

إذا كان العائد هو الصحيح psStreamInit ثم يدعو IStream::قراءة حجم المخزن المؤقت.

إذا كان كل شيء تبدو جيدة حتى الآن ، psStreamInit ثم يقرأ في 1024 بايت قطع حتى قراءة استنفدت.ومع ذلك.على رأس حجم الملف.

STDMETHOD(Read)(void *pv, ULONG cb, ULONG *pcbRead)

pcbRead غير صالح.قد تحتاج إلى استخدام شيء من هذا القبيل IsBadReadPtr

--

مايكل

نصائح أخرى

أن أوفر عليك بعض الكتابة.بالنسبة لي كان يعمل في هذه الطريقة (فقط لا يعمل اختبار على نطاق واسع):

void flash_load_memory(FlashWidget* w, void* data, ULONG size) {
        FlashMemoryStream fStream = FlashMemoryStream(data, size);
        IPersistStreamInit* psStreamInit = NULL;
        w->mFlashInterface->QueryInterface(IID_IPersistStreamInit,(LPVOID*) &psStreamInit);
        if(psStreamInit) {
            psStreamInit->InitNew();
            psStreamInit->Load((LPSTREAM)&fStream);
            psStreamInit->Release();
        }
    }

class FlashMemoryStream : IStream {
    public:
        FlashMemoryStream(void* data,ULONG size) {
            this->data = data;
            this->size = size;
            this->pos = 0;
        }

        HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, LPVOID* ppv) {
            return E_NOTIMPL;
        }

        ULONG STDMETHODCALLTYPE AddRef() {  
            return E_NOTIMPL;
        }

        ULONG STDMETHODCALLTYPE Release() {  
            return E_NOTIMPL;
        }

        // IStream methods
        STDMETHOD(Read) (void *pv,ULONG cb,ULONG *pcbRead) {
            if(pos == 0 && cb == 4) {
                memcpy(pv,"fUfU",4);
                pos += 4;
                return S_OK;
            }
            else if(pos == 4 && cb == 4) {
                memcpy(pv,&size,4);
                size += 8;
                pos += 4;
                return S_OK;
            }
            else {
                if(pos + cb > size) cb = size - pos;
                if(cb == 0) return S_FALSE;
                memcpy(pv,(char*)data + pos - 8,cb);
                if(pcbRead) (*pcbRead) = cb;
                pos += cb;
                return S_OK;
            }
        }

        STDMETHOD(Write) (void const *pv,ULONG cb,ULONG *pcbWritten) { return E_NOTIMPL; }
        STDMETHOD(Seek) (LARGE_INTEGER dlibMove,DWORD dwOrigin,ULARGE_INTEGER *plibNewPosition) { return E_NOTIMPL; }
        STDMETHOD(SetSize) (ULARGE_INTEGER libNewSize) { return E_NOTIMPL; }
        STDMETHOD(CopyTo) (IStream *pstm,ULARGE_INTEGER cb,ULARGE_INTEGER *pcbRead,ULARGE_INTEGER *pcbWritten) { return E_NOTIMPL; }
        STDMETHOD(Commit) (DWORD grfCommitFlags) { return E_NOTIMPL; }
        STDMETHOD(Revert) (void) { return E_NOTIMPL; }
        STDMETHOD(LockRegion) (ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) { return E_NOTIMPL; }
        STDMETHOD(UnlockRegion) (ULARGE_INTEGER libOffset,ULARGE_INTEGER cb,DWORD dwLockType) { return E_NOTIMPL; }
        STDMETHOD(Stat) (STATSTG *pstatstg,DWORD grfStatFlag) { return E_NOTIMPL; }
        STDMETHOD(Clone) (IStream **ppstm) { return E_NOTIMPL; }

        void* data;
        ULONG size;
        ULONG pos;
    };

كونه فلاش الرجل أنا لا أعرف أي تفاصيل عن C++ الجانب ، ولكن إذا قمت بعمل طلب فلاش على الجانب وهمية البروتوكول على الجانب C هل لك اعتراض على هذا الطلب والإجابة عليه مع البيانات تيار ؟ أعني شيئا مثل:

var mc:MovieClip = createEmptyMovieClip( "mc", 0 );
mc.loadMovie( "fakeprotocol://"+filename )

طالما الاستجابة تبدو (فلاش) مثل HTTP تيار ، وهذا ما يجب أن يعمل.(أعتذر مقدما إذا كان "اعتراض على طلب والعودة دفق البيانات" هو جزء كنت طالبا المساعدة.)

بالإضافة إلى ذلك....فلاش لاعب يعزز IPersistStorage.فلاش.تشى IPersistStorage pStorage.تحميل (mystorage_as_stream)

..من الناحية النظرية.

آسف أعلاه..كنت أنوي المشاركة فلاش لاعب يعزز IPersistStreamInit.فلاش.تشى IPersistStreamInit pStream.تحميل (my_stream)

مايكل

هذه الطريقة لا تعمل عند محاولة تحميل فيلم طريق MovieclipLoader أو LoadMovie من فيلم آخر!!!

والنتيجة هي أن استبدال استدعاء ملف SWF!!لذا هذه الطريقة تعمل فقط من أجل تحميل ملف قاعدة.

شخص يعرف طريقة أفضل من أن تعمل أيضا مع MovieClipLoader و LoadMovie?شكرا

MS VC ATL العينة (قد بنيت مع VS 2010 SP1 + SDK Windows 7.1 و اختبار على ويندوز 7 SP1 64 بت مع Flash64_11_3_300_257.ocx / Flash32_11_3_300_257.ocx و على ويندوز XP SP3 32-bit مع Flash32_11_3_300_257.ocx):

#pragma pack(push, 1)

typedef struct _FLASH_STREAM_HEADER
{
    DWORD m_dwSignature;
    DWORD m_dwDataSize;
} FLASH_STREAM_HEADER, *PFLASH_STREAM_HEADER;

#pragma pack(pop)

static HRESULT LoadFlashMovieFromResource(ATL::CComPtr<IShockwaveFlash>& spShockwaveFlash,
    UINT nResourceID, LPCTSTR pszResourceType = RT_RCDATA)
{
    HMODULE hModule = ATL::_AtlBaseModule.GetModuleInstance();
    ATLASSUME(hModule != NULL);

    //HINSTANCE hResourceInstance = ATL::AtlFindResourceInstance(nResourceID, pszResourceType);
    //HRSRC hResource = ::FindResource(hResourceInstance, MAKEINTRESOURCE(nResourceID),
    //  pszResourceType);

    HRSRC hResource = ::FindResource(hModule, MAKEINTRESOURCE(nResourceID), pszResourceType);

    if (hResource == NULL)
        return HRESULT_FROM_WIN32(::GetLastError());

    DWORD dwResourceDataSize = ::SizeofResource(hModule, hResource);

    if (dwResourceDataSize == 0)
        return HRESULT_FROM_WIN32(::GetLastError());

    HGLOBAL hResourceLoaded = ::LoadResource(hModule, hResource);

    if (hResourceLoaded == NULL)
        return HRESULT_FROM_WIN32(::GetLastError());

    ATL::CComPtr<IStream> spStream;

    HRESULT hResult = ::CreateStreamOnHGlobal(NULL, TRUE, &spStream);

    if (FAILED(hResult))
        return hResult;

    FLASH_STREAM_HEADER fsh = {0x55665566, dwResourceDataSize};

    ULARGE_INTEGER uli = {sizeof (fsh) + dwResourceDataSize};

    hResult = spStream->SetSize(uli);

    if (FAILED(hResult))
        return hResult;

    hResult = spStream->Write(&fsh, sizeof (fsh), NULL);

    if (FAILED(hResult))
        return hResult;

    hResult = spStream->Write(reinterpret_cast<void*>(hResourceLoaded), dwResourceDataSize, NULL);

    if (FAILED(hResult))
        return hResult;

    uli.QuadPart = 0;

    hResult = spStream->Seek(*reinterpret_cast<PLARGE_INTEGER>(&uli), STREAM_SEEK_SET, NULL);

    if (FAILED(hResult))
        return hResult;

    ATL::CComPtr<IPersistStreamInit> spPersistStreamInit;

    hResult = spShockwaveFlash.QueryInterface(&spPersistStreamInit);

    if (SUCCEEDED(hResult))
        hResult = spPersistStreamInit->Load(spStream);

    return hResult;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top