无临时文件播放内存中的Flash(*.swf)文件

本文介绍了一种在不创建临时文件的情况下,直接在内存中播放Flash (*.swf) 文件的方法,详细探讨了相关技术和实现细节。
摘要由CSDN通过智能技术生成

 

播放内存中的 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(
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值