本帖最后由 leo_zh 于 2012-05-08 17:06:51 编辑

解决方案 »

  1.   

    组件其实就是调用的程序通过访问注册表来进行组件的加载的,你可以尝试下修改添加组件在注册表中clsid,progid,appid等,让程序能找到这个组件
      

  2.   

    不用这么麻烦吧?只要利用VS的工具OLE-COM Object Viewer把Flash相关的组件接口头文件导出来就可以使用了,而且这些接口的顺序在以后的Flash版本中都不会变化的,保持兼容的。
      

  3.   

    但是我们使用的组件是Adobe提供的Flash10o.ocx 组件,这个的clsid,progid,appid还能被修改吗?即使我们再开发一个COM组件,让它来封装Flash10o.ocx ,但我们在封装Flash10o.ocx 时,仍然要查找注册表来加载它。有没有什么方法,能让我们绕过注册表,使两个版本的flash插件共存?因为如果你安装了flash 11,再安装flash 10的话,它会提示你无法安装。
      

  4.   

    是不是可以考虑内嵌一个browser来调用NPSWF32.dll
      

  5.   

    这个链接的问题跟我的需求很像 http://forums.adobe.com/message/20674
    多谢回复。我们需要播放swf文件时,取得播放时的参数,比如比特率,缓冲时间等等,如果内嵌browser的话,这些数据我们还好获取么?
      

  6.   

    clsid能不能用,就看新版本的Flash组件的clsid是不是都一样的,progid,appid等都可以修改的
      

  7.   

    多谢回复。各个版本flash插件的clsid是一样的,我查过。否则的话,所开发的应用程序在不同版本插件间将会不兼容
      

  8.   

    发布出来的CLSID肯定是不会再改变了,要用FLASH接口,就像我前面说的,导出得到头文件之后,用COM的使用方法进行使用就可以了。
    IShockwaveFlash* flashPtr = NULL;
    CoCreateInstance(__uuidof(ShockwaveFlash), NULL, CLSCTX_INPROC_SERVER, __uuidof(IShockwaveFlash), (void**)&flashPtr );
    这样只要在正常安装了FLASH插件的机器上,都可以这么使用,不需要查注册表的。
      

  9.   

    是这样的,我们不能用用户机器上安装的flash插件,因为各个用户机器上安装的插件的版本有可能各不相同。所以我们需要固定下来用一个版本(比如flash 10),将它打包到我们的程序中。我们的程序只调用自己提供的这个插件。
    我们考虑到了firefox所使用的方法,只要将NPSWF32.dll拷贝到Firefox的plugin目录下,Firefox就能识别并驱动它。但NPSWF32.dll是为browser定制的,我们在非browser的程序中怎么使用它?求思路。
      

  10.   

    其实OCX就是DLL,你可以试着加载Flash10o.ocx,然后拿到以下导出函数接口地址
    DllCanUnloadNow
    DllGetClassObject
    DllRegisterServer
    DllUnregisterServer
    CoCreateInstance干的事情,估计就是调用了DllGetClassObject,拿到类厂然后创建实例。如果你有固定的版本,LoadLibrary加载后,可以试着用DllGetClassObject创建出来。P.S:NPSWF32.dll估计你是没办法使用的,这个DLL是基于NPAPI的Plugin,专门给使用这种框架的应用程序做插件的,比如Firefox, Chrome都可以使用。调用规则和COM不是同一条路,从导出函数列表上看很明显,如果要用,估计得参考NPAPI的开发文档了。
      

  11.   

    另外再补充下,其实Flash的版本从9开始,除了新增的功能接口,其他都一致的,如果只是使用普通的接口功能,兼容性方面的问题应该不需要担心,9,10,11都能正常使用,当然,如果利用了新特性,那么肯定只能保证支持该特性的版本为最低版本了。程序做个FLASH的最低版本检测即可,让用户更新到最新就好了。
      

  12.   

    非常感谢你的回复。没办法,按照需求,我不能使用用户机器上安装的Flash版本,只能使用我的程序包内自带的Flash版本。我研究了下NPAPI的开发文档,但还没有找到实现的思路。
    请大家多多赐教。
      

  13.   

    在网上查找,找到一个系列文章。http://www.cppblog.com/epubcn/category/8842.html
    “浏览器会传入NPPVpluginScriptableNPObject(作为variable参数)来查询插件是否支持Scriptable功能(即和脚本语言交互的功能),在这里,我们可以利用NPN_CreateObject方法来创建一个NPObject对象,并且作为value返回给浏览器。这样,浏览器就通过这个NPObject对象和我们的插件建立了连接。当页面上Javascript调用了我们插件对象的某个方法时,浏览器会调用该NPObject对象的HasMethod方法来查询是否支持这个方法,如果支持,则会调用NPObject对象的Invoke方法,传入方法名、参数等信息。这样,我们就可以让网页上的脚本语言来执行我们编写的函数了。在Windows上,我们编写的函数就如同编写普通的应用程序一样,可以使用很多Windows API来完成许多复杂的工作。”
    发现插件是可以直接和javascript代码交互的。请问,插件中封装的函数能否与C++代码交互?
    即用在C++中直接调用插件中封装的函数?