请教各位,  在ActiveX中使用了Flash控件, 并且有交互CallFuntion(), 该控件嵌入其它程序中时没有问题,嵌入360浏览器, 傲游等, 也没有问题, 但是, 如果使用IE, 则一调用CallFunction就会崩溃,这该怎么解决? 按道理, 360, 傲游等使用的也是IE的核, 我已经把IE的安全级调至最低,禁止的选项都已经启用, 仍然不行.
如下图, 在360中Flash显示与交互均正常:

解决方案 »

  1.   

    可能跟多进程环境 或者 COOKIE 访问有关
      

  2.   

    IE6,7都不行. 一跟Flash交互就崩溃
      

  3.   

    就是只要调用Flash的接口就崩溃, 任何一个flash ocx 的callFunction
      

  4.   


    ShockwaveFlashObjects::IShockwaveFlash* flashInterface;
    BSTR returnVal = 0;
    HRESULT result = flashInterface->raw_CallFunction(_bstr_t(Impl::serializeInvocation(funcName, args).c_str()), &returnVal);
    就挂在这边, 一旦使用Flash控件提供的这个接口函数, 就崩了, 调试进不去, Flash控件无法调
      

  5.   

    按道理来说,你内部和FLASH的交互,IE并不知道也不会做过滤啊,这个交互有没有依赖其他的东西,而其他的东西又会受到IE的限制?
      

  6.   

    没有依赖其它. flashInterface 已经是Flash的Com对象, 就是每次调用返回都是S_FAIL.除了IE, 返回都是S_OK
      

  7.   

    调用线程进行COM初始化了吧?
      

  8.   

    IE8的版本呢?也许是IE6,7的问题。下面这个函数的部分,在不同浏览器下的执行,会不会结果不同 /:^S?
    _bstr_t(Impl::serializeInvocation(funcName, args).c_str())我又觉得是不是初始化的地方出问题了?因为搜索后发现只有对这个应用的部分,还有一些也是使用出了问题的帖子。
    http://redmine.mygui.info/repositories/entry/mygui/trunk/Plugins/Plugin_HikariWidget/FlashControl.cpp?rev=2379
      

  9.   


    跟你的贴子里几乎一样, 正常使用没有问题, 在IE中调用, flashInterface->raw_CallFunction 始终失败
      

  10.   


    还需要哪些信息? 在控件中使用COM方式调用Flash, 自己写测试程序没有问题, 360中也没有问题,
    在IE中, 该控件中的flash对象调用 raw_CallFunction 返回失败.
      

  11.   

    到底是崩溃还是仅返回错误的HRESULT?HRESULT的值是多少?第三方浏览器和IE的区别仅在于INTERNET SESSION的选项不同,IE是内置的,不可改变的,不妨再做一个BHO插件调用 InternetSetOption/InternetSetPerSiteCookieDecision/CoInternetSetFeatureEnabled 来调整这些选项,看看是否有什么不同,这些相关的API才是造成IE和第三方浏览器不同的原因。
      

  12.   

    AddRef崩溃不?先看看COM指针是否合法,有时候缓冲区溢出把COM指针擦掉了
      

  13.   

    我也去查找了一些相关的东西,觉得这个可能有帮助:
    http://forums.adobe.com/message/1872948
    里面提到碰到的问题是,应用程序调用这个callFunctions就会正常,但被应用程序载入到虚拟空间的dll是不正常的,如果是这样的话,很有可能的一个问题是,在DLLload的wait一个线程的载入完成了,这个新线程可能是IE创建出来用来载入flash DLL的。这个的原因是系统在线程的初始化routine中有对DllMain进行调用,而DllMain中却在wait线程初始化完成执行返回,互相等待造成死锁。可能会导致在DllMain执行不完的情况下,dll里export的函数被调用到。activeX若是因为这个原因出错,解决方法
    1.可能就是要换IE版本了,毕竟不能patch IE的实现。或者你可以用一个单独的exe,来进行交互。 /:^]
    2.因为从来没做过activeX的程序,想自己测试也不得,我纯粹是猜测,当原因出在这个本身模块也是一个ocx时,那在dllmain初始化的时候自己手工先用LoadLibarayA载入一下flash的ocx和dll,也许会解决问题:
    C:\WINDOWS\system32\Macromed\Flash\Flash10n.ocx
    C:\WINDOWS\system32\Macromed\Flash\FlashUtil10n_ActiveX.dll
    3.像帖子里提出来的二个方法,一是不用callFunction了,让Flash里一个计时器每隔10ms给activeX发一个消息过来;二是自己写一个COM servers wapper这样会被当做进程主模块的COM组建,把flash的ocx包装起来给自己用,但这个方法我觉得处理的不那么漂亮。
    4.那个帖子提出说,调用callFunction之前,必须设置callBack Func。The addCallback call is important. Without it the CallFunction from C++ will throw an exception.例子是:
    flash.external.ExternalInterface.addCallback("testFunction", testFunction);
    function testFunction(str:String):Boolean
    {
        // Do something here...
        return (true);
    }
    这个可以解决c#写的activeX的callFunction问题。另外看了些其他的帖子意识到一个情况是,IE对要解析的网页里的包围起来的""value的处理很有问题,不知道这个有帮助不,LZ请把_bstr_t(Impl::serializeInvocation(funcName, args).c_str())的结果写出来看看,http://www.codingforums.com/archive/index.php/t-125185.html还是不行的话,LZ是用OGRE做的flash交互程序吧,我搜索的结果是发现都是OGER用户提及的这个callFunctions的出错,是OGER的实现问题?"自己写测试程序没有问题",是说LZ自己写了个以callFunctions调用flash的程序测试无问题吗?最后,倘若实在在acticeX中用callFunction做不到的话,用javascript之类的wapper来具体的callFunctions,可行不?希望能帮到你,昨天没睡好,现在非常困,也希望没把问题导向误区。 /:^]
      

  14.   

    感谢大家的回复, 今天刚回来, 我一一解释一下to: jameshooo
    仅仅是返回值HRESULT 始终为E_FAIL, 我上面已经提及to:JiangSheng
    Addref无问题, Flash可以正常显示播放,就是无法调用Flash的函数to: xiaopoy
    首先非常感谢你花了不少时间去研究.
    我确实是使用的OGRE, 结果差不多是这样, 其实跟Ogre的关系也不算大吧, 在ActiveX中使用了Ogre来渲染,问题出在ActiveX与其中使用的Flash的交互上, 在这里,渲不渲染都无所谓了,关键是调用Flash的接口都失败.
    "自己写测试程序没有问题",是指自己做一个程序来调用这个控件时, 没有问题.
    另外, 你提及的5个方法,
    1. 没有办法这么做
    2. 已经这么干
    4. 也已经这么干
    第3种和最后一种, 还没能去尝试, 主要是烦锁这里写一下那个_bstr_t的值:<invoke name="setFPS" returntype="xml"><arguments><string>Test文本内容;</string></arguments></invoke>Flash中的导出函数:function setFPS(fps:Number)
    {
    fps_txt.text = fps.toString();
    }ExternalInterface.addCallback("setFPS", setFPS);
    我看了你的那个链接, 可能不太一样,因为我这里与Flash的交互部分, 不是通过IE来进行的,而是我的控件直接调用创建的Flash对象 to: healer_kx
    正是使用的Hikari, 针对OGRE的一个开源的使用Flash的库, 你可以直接下载
    地址: http://princeofcode.com/download.php?target=Hikari_v0.3_SDK_MSVC2008_Ogre_1.60.zip
      

  15.   

    我认为这个问题确实跟IE相关。FLASH控件是一个黑盒子,无法知道它内部的事情,但多多少少它都会利用容器的一些特性,我觉得它针对IE做了特别的处理,比如网络、COOKIE、BASEURL、安全限制等等,不妨跟踪一下FLASH控件向容器查询了哪些接口(当然做这种调试很繁琐)。
      

  16.   


    听说Flash今年要出独立缓冲区的版本,不知道能否解决此问题
      

  17.   

    最新的测试发现, 不仅是我的ActiveX与Flash进行交互时, 被屏蔽掉,
    就是Flash自身, 在我的ActiveX中被加载时, Flash自身运行的函数(比如Flash在打开时,即刻自己执行一个写入字符串的操作), 一样的不响应
      

  18.   

    在自己的程序里使用flash,还是用的浏览器的部分实现的。就像不安装IE,有些功能会不能用。不带引号的这样呢?
    <invoke name=setFPS returntype=xml><arguments><string>Test文本内容;</string></arguments></invoke>依照你说的情况,我更感觉是某个DLL没被加载的情况,在一个IE和flash正常沟通的进程里列出它的DLL们,再列出我们activeX和flash沟通时进程里的DLL,看看LoadLibrary了所少的DLL会解决吗?笔记本的触摸屏+打字给用的很生气,而且对activeX实在没写过,考虑下载个VS自己搭建想调试都不得。LZ可以做个简单的演示程序,我来跟踪下这个Invoke调用里的东西吗?
      

  19.   

    随便新建了个ActiveX, 插入Flash并交互, 测试结果如下:Flash使用ActionScript2.0导出, 在IE与非IE情况下, 结果相同, 结果如下:
    Flash::SetVariable()函数可以动态设置Flash文本框内容,
    Flash::CallFunction() 直接崩溃Flash使用ActionScript3.0导出,在IE下, 
    Flash::SetViriable()和CallFunction都不工作在非IE下, CallFunction() 起作用, SetViriable无反应(跟我开头的情况一致)上传ActiveX工程源码以及Flash的源代码文件(fla文件)http://files.cnblogs.com/zhucde/TestActiveX.rar
      

  20.   

    :P
    to #30,新版本的VS用vs2005载入出错,幸好文件不多,把sln中和vcproj中的版本好改了下就可以转换vcproj了。我把发现的东西记下来。
    首先,我的DLL版本是:
    Flash10n.ocx 10.2.152.32, 基地址==042F0000
    oleaut32.dll 5.1.2600.3266 xp sp3, 基地址==770F0000activeX里的Invoke最后调用到flash的这个函数:
    .text:04493A43
    int __stdcall CallFunction_InvokeFunc(int, int, int, LCID lcid, int, int, int, int, int)它里面简单的判断后,又调用OLE里的
     public: virtual long __stdcall CTypeInfo2::Invoke(void *, long, unsigned short, struct tagDISPPARAMS *, struct tagVARIANT *, struct tagEXCEPINFO *, unsigned int *);在这个OLE的Invoke里,执行到
    ElemInfoTable::GetFuncIndexOfMemidInvkind(long,uint,uint *);
    时,参数为  GetFuncIndexOfMemidInvkind (000000C6, 00000001, 0223EDA4), 对应CallFunction调用InvokeHelper的参数, DISPATCH_METHOD==1
    InvokeHelper(0xc6, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms,  request);
    接着OLE跑去初始化参数、初始化参数类型,然后DispCallFunc就重新进入flash执行真正的CallFunction了
    此时的堆栈参数是:
    04914B7C
    0021AE64  UNICODE "<invoke name=setFPS returntype=xml><arguments><string>30tttT</string></arguments></invoke>"
    0223ED64
    0223EEA4
    04D33CA0
    0223ED14
    0223EDB0在flsah中,
    call    sub_4400580
    时候返回了一个空的结果,使得之后出错,返回的错误是
    E_FAIL _HRESULT_TYPEDEF_(0x80004005L)
    接着OLE给用户就返回了个没有意义的
    DISP_E_EXCEPTION _HRESULT_TYPEDEF_(0x80020009L)于是再回到4400580中看看返回值是怎么产生的。最后跟踪到这儿
    04330D37    E8 76FBFFFF     CALL Flash10n.043208B2
    一进来就看到invoke/ name二个字符串,估计着就是调用函数时出错了。
    再跟踪发现是在查找SetFPS的时候,有一个数组+链表中是空的,而无法找到函数出错了。
    再看看发现这个链表所在的类是这儿初始化的:
    call    sub_43FC580
    当0x6a0那个指针不为空时,就会初始化,不然直接返回之前储存的信息。
    这个链表的来源是第二次调用的callback,在真正的CallFunction的第一个参数中的:
     [[argc0+ 0x84]+ 0x6a0]+ 0xc于是猜测这个flash的CallBack在第一次调用时会初始化一个函数表。:P 到这再怀疑下,会不会还是flash里的那个ExternalInterface.addCallback("setFPS", setFPS);的问题?明天接着看看。我每天只有一些时间用来看另外的东西。 /:^] 
      

  21.   

    继续期待楼上的研究.ExternalInterface.addCallback("setFPS", setFPS); 应该不会出问题, 要不然360浏览器或者其它方式的调用也不会正常
      

  22.   

    LZ这个问题解决的怎么样了?我最近在忙一些东西,没有进一步看。不知道LZ对这个问题最后是怎么解决的
      

  23.   

    http://hi.baidu.com/lael80/blog/item/eae103d5c18ea5c451da4b92.html加入IE受信任站点. 就可以了