从内存流或字节数组加载Flash电影

问题描述 投票:3回答:3

我想从内存流或字节数组而不是磁盘上的文件加载SWF对象。

[AxShockwaveFlash类提供了加载SWF的方法和属性,提供了以字符串形式到达磁盘的路径,但是我还没有看到另一种方式。有一个InlineData属性,但通常该类是未记录的,我不知道该属性的作用。可以完成吗?

谢谢F

c# flash activex
3个回答
10
投票

我假设您要在C#中而不是在Flash本身中初始化它。可以做到,但是这样做有局限性(例如,您可能会遇到奇怪的安全问题)。另一个警告是,此方法仅在VS 2010 / Flash 10上进行了测试,但从理论上讲,它应该可以在任何版本中使用。

[好,让我们假设您已使用标准机制将Flash控件放在表单上。还要将所需的Flash文件添加到资源(或由您决定的内联字节数组)。

然后使用以下代码加载Flash文件。

private void InitFlashMovie(AxShockwaveFlash flashObj, byte[] swfFile)
{
    using (MemoryStream stm = new MemoryStream())
    {
        using (BinaryWriter writer = new BinaryWriter(stm))
        {
            /* Write length of stream for AxHost.State */
            writer.Write(8 + swfFile.Length);
            /* Write Flash magic 'fUfU' */
            writer.Write(0x55665566);
            /* Length of swf file */
            writer.Write(swfFile.Length);                    
            writer.Write(swfFile);
            stm.Seek(0, SeekOrigin.Begin);
            /* 1 == IPeristStreamInit */
            flashObj.OcxState = new AxHost.State(stm, 1, false, null);
        }
    }
}

传递表单的Flash对象和包含要加载的Flash文件的字节数组,它[[应正常工作。


2
投票

[你是男人非常感谢我在搜索它,但是除了本机c ++之外没有找到,我尝试了一下,效果很好]]private:void initflash(AxShockwaveFlashObjects::AxShockwaveFlash^ax,array<System::Byte>^data) { MemoryStream^ ms=gcnew MemoryStream(); BinaryWriter^ bwr=gcnew BinaryWriter(ms); bwr->Write(8+data->Length); bwr->Write(0x55665566); bwr->Write(data->Length); bwr->Write(data); ms->Seek(0,SeekOrigin::Begin); ax->OcxState=gcnew AxHost::State(ms,1,false,nullptr); bwr->Close(); delete bwr; ms->Close(); delete ms; } private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { axShockwaveFlash1->FlashVars="indextext=courses/en0600000000/launch.text.xml&cid=0600000000&l1=en&l2=none"; array<System::Byte>^data= File::ReadAllBytes("F:\\Learning\\unformated\\New Folder (3)\\CCNA\\theme\\index.swf"); initflash(axShockwaveFlash1,data); SubclassHWND^ s=gcnew SubclassHWND(); s->AssignHandle(axShockwaveFlash1->Handle); }

我使用以下类来防止右键单击菜单的最后两行

ref class SubclassHWND :public NativeWindow { public: SubclassHWND(){} protected: virtual void WndProc(Message %m) override { if(m.Msg==0x204) { return; } NativeWindow::WndProc(m); } };

0
投票

VB.net版本:

© www.soinside.com 2019 - 2024. All rights reserved.