请教各位, 在ActiveX中使用了Flash控件, 并且有交互CallFuntion(), 该控件嵌入其它程序中时没有问题,嵌入360浏览器, 傲游等, 也没有问题, 但是, 如果使用IE, 则一调用CallFunction就会崩溃,这该怎么解决? 按道理, 360, 傲游等使用的也是IE的核, 我已经把IE的安全级调至最低,禁止的选项都已经启用, 仍然不行.
如下图, 在360中Flash显示与交互均正常:
如下图, 在360中Flash显示与交互均正常:
解决方案 »
- 关于struct tm *p的一个很奇怪的问题
- 关于声音文件,那个波形的播放的实时值如何取得?
- 不知道你们碰到这样的问题没?在CPropretySheet上使用RECHEDIT控件导致出错,但换成EDIT就没错.
- release和debug问题。
- 一个简单的问题,什么是设备坐标,逻辑坐标?
- SetWindowPos后,如何让Dialog随窗口移动?
- 导入位图
- 100分,寻一个希望:在PC/SC中调用SCardGetStatusChange不会block,参数设置?
- 请问能不能让一个框架右上角的“最小化”、“最大化”、“关闭”的按钮不显视呢?
- !!! 难道这里就没有一个人会吗?
- 关于树形控件背景位图显示
- MFC Slider进度条美化的问题
ShockwaveFlashObjects::IShockwaveFlash* flashInterface;
BSTR returnVal = 0;
HRESULT result = flashInterface->raw_CallFunction(_bstr_t(Impl::serializeInvocation(funcName, args).c_str()), &returnVal);
就挂在这边, 一旦使用Flash控件提供的这个接口函数, 就崩了, 调试进不去, Flash控件无法调
_bstr_t(Impl::serializeInvocation(funcName, args).c_str())我又觉得是不是初始化的地方出问题了?因为搜索后发现只有对这个应用的部分,还有一些也是使用出了问题的帖子。
http://redmine.mygui.info/repositories/entry/mygui/trunk/Plugins/Plugin_HikariWidget/FlashControl.cpp?rev=2379
跟你的贴子里几乎一样, 正常使用没有问题, 在IE中调用, flashInterface->raw_CallFunction 始终失败
还需要哪些信息? 在控件中使用COM方式调用Flash, 自己写测试程序没有问题, 360中也没有问题,
在IE中, 该控件中的flash对象调用 raw_CallFunction 返回失败.
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,可行不?希望能帮到你,昨天没睡好,现在非常困,也希望没把问题导向误区。 /:^]
仅仅是返回值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
听说Flash今年要出独立缓冲区的版本,不知道能否解决此问题
就是Flash自身, 在我的ActiveX中被加载时, Flash自身运行的函数(比如Flash在打开时,即刻自己执行一个写入字符串的操作), 一样的不响应
<invoke name=setFPS returntype=xml><arguments><string>Test文本内容;</string></arguments></invoke>依照你说的情况,我更感觉是某个DLL没被加载的情况,在一个IE和flash正常沟通的进程里列出它的DLL们,再列出我们activeX和flash沟通时进程里的DLL,看看LoadLibrary了所少的DLL会解决吗?笔记本的触摸屏+打字给用的很生气,而且对activeX实在没写过,考虑下载个VS自己搭建想调试都不得。LZ可以做个简单的演示程序,我来跟踪下这个Invoke调用里的东西吗?
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
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);的问题?明天接着看看。我每天只有一些时间用来看另外的东西。 /:^]