播放内存中的
Flash(*.swf)
文件
作者:Sunline
lisunlin0@yahoo.com.cn
日期:2007年4月
下载例示代码:
SDK示例 :http://www.websamba.com/dust-fly/src/MemSwfDemo.rar
MFC示例 :http://www.websamba.com/dust-fly/src/MemSwfDemoMFC.rar
(放置文件的是一个免费空间 ,若不能下载,请从本人上传到CSDN的资源中下载.)
摘要
某些情况下希望直接从内存中播放 swf文件,而MecraMedia的ShockwaveFlash插件没有提供直接从内存中播放swf文件的功能,本文解决了直接从内存中播放swf文件的问题.
关键字
播放 swf文件, flash播放, 播放内存中的flash文件, 无临时文件播放资源中的swf文件,无临时文件播放内存中的swf文件
Load swf from memory, play flash from memory, play flash
简介
平时喜欢自己动手写几个小程序,利用 ShockwaveFlash插件实现Flash界面,效果很好,只是有个缺陷,那就是ShockwaveFlash只能用磁盘文件形式的Flash(*.swf)文件,在分发一个简单的应用程序时都至少有一个程序(.exe)文件和一个Flash(.swf)文件,这样非常不便,后来想到把Flash(.swf)文件放到程序文件内,需要的时候在内存中播放Flash,首先想到的便是有没有这样的解决方案,但是查了n多的资料,没有满意的解决方案(在ShockwaveFlash控件中有个SetMovieData()方法很像用来播放内存Flash,但MacroMedia的文档中没有这个方法的详细具体说明,对这个方法用了各种途径试了多次,没有任何有意义的反馈;另外在网上也有关于播放内存Flash的解决方案,但得收取¥或$,而我是个业余爱好者,口袋空空,而且也没有必要购买商业库。)。于是就自己动手写一个可以播放内存Flash的类。
实现原理
Shockwave Flash object支持本地Flash(.swf)文件播放,比如用“file://c:/UI.swf”或“c:// UI.swf”都可以播放C盘下的UI.swf文件。那么它一定调用了文件操作的各种API,因此可以通过API Hook技术来实现播放内存中的Flash文件。而主要的文件操作函数有CreateFile(…), ReadFile(…), GetFileSize(…), GetFileAttributes (…) ...,使用API Hook后,我们就可以欺骗ShockwaveFlash,在其读文件时返回实际的内存中的swf文件内容。
这样,我们就可以让自己的程序潇洒地使用Flash文件了。
实现方法:
//MemoryFile.h
//
通过Hook文件操作函数,把读取磁盘文件的操作转向自己的实现
//
说明:虚拟文件名mlpFileName字符串由CMemoryFile类内部拷贝一份,而内存文件的内存块则使用传入
//
的内存块(重新拷贝一份太浪费内存了)。
#pragma
once
//
class
CMemoryFile
{
protected
: //struck members
struct MFHANDLE{
……};
struct MFFINDHANDLE {
……};
static MFFINDHANDLE *spFindHandleHead;
MFHANDLE *mpHandleHead;
static CMemoryFile *spHead;//a inversion link head, actually, it’s a trail.
LPCWSTR mlpFileName;
LPBYTE mlpFileBuffer;
DWORD mdwFileSizeLow;
DWORD mdwFileSizeHigh;
DWORD mdwFileAttributes;
CMemoryFile *mpNext;
protected
:
//
静态数据成员
//tCreateFileW record the Ture entrypoint to CreateFileW
static HANDLE (__stdcall *tCreateFileW)(LPCWSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);
static
BOOL (__stdcall *tReadFile)(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped);
……
//
静态方法
static HANDLE __stdcall mfCreateFileW(
LPCWSTR lpFileName, // pointer to name of the file
DWORD dwDesiredAccess, // access (read-write) mode
DWORD dwShareMode, // share mode
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // pointer to security attributes
DWORD dwCreationDisposition, // how to create
DWORD dwFlagsAndAttributes, // file attributes
HANDLE hTemplateFile // handle to file with attributes to copy
);
static BOOL __stdcall mfReadFile(