打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Flex与Win32通信实例之ExternalInterface
项目中要实现Flex打开文件夹选择框(Flex做为桌面程序的UI),没办法,如果不用AIR只能在下面加一层Container了。网上搜来搜去差不多都是讲FSCommand怎样与VC++交互,可是FSCommand不能及时返回值呀。经过一番摸索,终于调通了ExternalInterface在VC++中的处理流程,看代码。

 

Cpp代码
  1. void CMyBicapDlg::OnFlashCallShockwaveflash1(LPCTSTR request)   
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     // "<invoke name='%s' returntype='xml'><arguments><string>%s</string></arguments></invoke>"  
  5.       
  6.     // parse request  
  7.     TiXmlDocument request_xml;  
  8.     request_xml.Parse(request);  
  9.     const char* request_name = request_xml.RootElement()->Attribute("name");  
  10.       
  11.     if (strcmp(request_name,"savedVideosDirectory") == 0 || strcmp(request_name,"bufferDirectory") == 0 || strcmp(request_name,"preferredExportDirectory") == 0)  
  12.     {  
  13.         // choose path  
  14.         CoInitialize(NULL);  
  15.         BROWSEINFO bi;  
  16.         bi.hwndOwner = this->GetSafeHwnd();  
  17.         bi.pidlRoot = NULL;  
  18.         bi.pszDisplayName = NULL;  
  19.         bi.lpszTitle = NULL;  
  20.         bi.ulFlags = BIF_BROWSEFORCOMPUTER|BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT;  
  21.         bi.lpfn = NULL;  
  22.         LPCITEMIDLIST pidl = SHBrowseForFolder(&bi);  
  23.         if(pidl != NULL)  
  24.         {  
  25.             TCHAR tpath[MAX_PATH] = _T("");  
  26.             BOOL bresult = SHGetPathFromIDList(pidl, tpath);  
  27.             if (bresult)  
  28.             {  
  29.                 std::string re_value = "<string>";  
  30.                 re_value = re_value+tpath+"</string>";  
  31.                 m_FlashPlayer.SetReturnValue(re_value.c_str());  
  32.             }  
  33.         }  
  34.   
  35.         CoUninitialize();  
  36.     }  
  37.       
  38. }  

 

首先,需要在项目中嵌入Flash player插件,网上有很多例子。另外Flex也要写好代码,这里略掉。

  1. 添 加一个ExternalInterface的事件处理函数,对于Flash player来讲就是FlashCall事件(跟FSCommand不同的),这里的事件处理函数是void CMyBicapDlg::OnFlashCallShockwaveflash1(LPCTSTR request)。没有返回值(下面会讲到),参数是一个XML格式的字符串。格式是"<invoke name='%s' returntype='xml'><arguments><string>%s</string>< /arguments></invoke>",去查查帮助就知道了。
  2. 处理request:标准C++没有处理XML的库,我去下载了tinyxml,小巧好用。下面就是按照个人需要处理request了,我这里是,打开一个文件夹选择对话框然后选择一个路径。
  3. 返 回值。事件处理函数是没有返回值的,但是flash player提供了一个方法:m_FlashPlayer.SetReturnValue(re_value.c_str());,专门传递返回值,格式 是<string>%s</string>(也可以是别的AS结构,具体看帮助)。

需要提醒的是,在处理期间要block掉Flex,ExternalInterface.call是有返回值的,如果不阻塞Flex,可能返回就是NULL,呵呵,不知道深层原因。另外,反过来调用格式也是一样的。

调试环境:win xp, VC++6.0, Flex builder 2.0

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Communicate betwen C# and an embeded Flash application ? ADM Blog
Flex 与 javascript 交互-wangcheng -JavaEye技术社区
VC弹出选择“文件路径”和选择“文件夹路径”对话框
Tomcat及MySQL中文乱码问题解决方案总览
用JDOM操作XML文件
flash与client交互
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服