Flex与Win32通信实例之ExternalInterface

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

    // TODO: Add your control notification handler code here 
    // "<invoke name='%s' returntype='xml'><arguments><string>%s</string></arguments></invoke>" 
     
    // parse request 
    TiXmlDocument request_xml; 
    request_xml.Parse(request); 
    const char* request_name = request_xml.RootElement()->Attribute("name"); 
     
    if (strcmp(request_name,"savedVideosDirectory") == 0 || strcmp(request_name,"bufferDirectory") == 0 || strcmp(request_name,"preferredExportDirectory") == 0) 
    { 
        // choose path 
        CoInitialize(NULL); 
        BROWSEINFO bi; 
        bi.hwndOwner = this->GetSafeHwnd(); 
        bi.pidlRoot = NULL; 
        bi.pszDisplayName = NULL; 
        bi.lpszTitle = NULL; 
        bi.ulFlags = BIF_BROWSEFORCOMPUTER|BIF_RETURNONLYFSDIRS|BIF_STATUSTEXT; 
        bi.lpfn = NULL; 
        LPCITEMIDLIST pidl = SHBrowseForFolder(&bi); 
        if(pidl != NULL) 
        { 
            TCHAR tpath[MAX_PATH] = _T(""); 
            BOOL bresult = SHGetPathFromIDList(pidl, tpath); 
            if (bresult) 
            { 
                std::string re_value = "<string>"; 
                re_value = re_value+tpath+"</string>"; 
                m_FlashPlayer.SetReturnValue(re_value.c_str()); 
            } 
        } 
 
        CoUninitialize(); 
    } 
     

 
首先,需要在项目中嵌入Flash player插件,网上有很多例子。另外Flex也要写好代码,这里略掉。
添加一个ExternalInterface的事件处理函数,对于Flash player来讲就是FlashCall事件(跟FSCommand不同的),这里的事件处理函数是void CMyBicapDlg::OnFlashCallShockwaveflash1(LPCTSTR request)。没有返回值(下面会讲到),参数是一个XML格式的字符串。格式是"<invoke name='%s' returntype='xml'><arguments><string>%s</string></arguments></invoke>",去查查帮助就知道了。
处理request:标准C++没有处理XML的库,我去下载了tinyxml,小巧好用。下面就是按照个人需要处理request了,我这里是,打开一个文件夹选择对话框然后选择一个路径。
返回值。事件处理函数是没有返回值的,但是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值