资源描述:
《delphi 无临时文件播放内存中flash(.swf)文件》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、Delphi无临时文件播放内存中的Flash(.swf)文件平时喜欢自己动手写几个小程序,利用ShockwaveFlash插件实现Flash界面,效果很好,只是有个缺陷,那就是ShockwaveFlash只能用磁盘文件形式的Flash(*.swf)文件,在分发一个简单的应用程序时都至少有一个程序(.exe)文件和一个Flash(.swf)文件,这样非常不便,后来想到把Flash(.swf)文件放到程序文件内,需要的时候在内存中播放Flash,首先想到的便是有没有这样的解决方案,但是查了n多的资料,没
2、有满意的解决方案(在ShockwaveFlash控件中有个SetMovieData()方法很像用来播放内存Flash,但MacroMedia的文档中没有这个方法的详细具体说明,对这个方法用了各种途径试了多次,没有任何有意义的反馈;另外在网上也有关于播放内存Flash的解决方案,但得收取¥或$,而我是个业余爱好者,口袋空空(而且也没有必要购买商业库。)。于是就自己动手写一个可以播放内存Flash的类。实现原理:ShockwaveFlash支持本地Flash(.swf)文件播放,比如用“file://c
3、:/UI.swf”或“c:\UI.swf”都可以播放C盘下的UI.swf文件。那么它一定调用了文件操作的各种API,因此可以通过APIHook技术来实现播放内存中的Flash文件。而主要的文件操作函数有CreateFile(…),ReadFile(…),GetFileSize(…),GetFileAttributes(…)...,使用APIHook后,我们就可以欺骗ShockwaveFlash,在其读文件时返回实际的内存中的swf文件内容。这样,我们就可以让自己的程序潇洒地使用Flash文件了。实
4、现方法: //MemoryFile.h//通过Hook文件操作函数,把读取磁盘文件的操作转向自己的实现//说明:虚拟文件名mlpFileName字符串由CMemoryFile类内部拷贝一份,而内存文件的内存块则使用传入//的内存块(重新拷贝一份太浪费内存了)。#pragmaonce//classCMemoryFile{protected://struckmembersstructMFHANDLE{……};structMFFINDHANDLE{……};staticMFFINDHANDLE*spFind
5、HandleHead;MFHANDLE*mpHandleHead;staticCMemoryFile*spHead;//ainversionlinkhead,actually,it’satrail.LPCWSTRmlpFileName;LPBYTEmlpFileBuffer;DWORDmdwFileSizeLow;DWORDmdwFileSizeHigh;DWORDmdwFileAttributes;CMemoryFile*mpNext;protected://静态数据成员//tCreateFile
6、WrecordtheTureentrypointtoCreateFileWstaticHANDLE(__stdcall*tCreateFileW)(LPCWSTRlpFileName,DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDisposition,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);static
7、BOOL(__stdcall*tReadFile)(HANDLEhFile,LPVOIDlpBuffer,DWORDnNumberOfBytesToRead,LPDWORDlpNumberOfBytesRead,LPOVERLAPPEDlpOverlapped);……//静态方法staticHANDLE__stdcallmfCreateFileW(LPCWSTRlpFileName,//pointertonameofthefileDWORDdwDesiredAccess,//access(read-
8、write)modeDWORDdwShareMode,//sharemodeLPSECURITY_ATTRIBUTESlpSecurityAttributes,//pointertosecurityattributesDWORDdwCreationDisposition,//howtocreateDWORDdwFlagsAndAttributes,//fileattributesHANDLEhTemplateFile//handletofilewithattribut