我想从内存流或字节数组加载SWF对象而不是磁盘上的文件。
AxShockwaveFlash类提供了加载SWF的方法和属性,提供了作为字符串的磁盘路径,但我还没有看到另一种方法。有一个InlineData属性,但通常该类没有文档,我不知道这个属性是做什么的。它可以完成吗?
由于 ˚F
答案 0 :(得分:9)
我认为你想要做的是用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文件的字节数组进行加载,应该工作。
答案 1 :(得分: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);
}
};
答案 2 :(得分:0)
VB.net版本:
然后添加此代码。
Dim swfFile As Byte() = IO.File.ReadAllBytes("C:\Users\root\source\file.swf")
Using stm As MemoryStream = New MemoryStream()
Using writer As BinaryWriter = New BinaryWriter(stm)
writer.Write(8 + swfFile.Length)
writer.Write(&H55665566)
writer.Write(swfFile.Length)
writer.Write(swfFile)
stm.Seek(0, SeekOrigin.Begin)
AxShockwaveFlash1.OcxState = New AxHost.State(stm, 1, False, Nothing)
End Using
End Using