项目中要实现Flex打开文件夹选择框(Flex做为桌面程序的UI),没办法,如果不用AIR只能在下面加一层Container了。网上搜来搜去差不多都是讲FSCommand怎样与VC++交互,可是FSCommand不能及时返回值呀。经过一番摸索,终于调通了ExternalInterface在VC++中的处理流程,看代码。
- void CMyBicapDlg::OnFlashCallShockwaveflash1(LPCTSTR 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)
- {
-
- 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();
- }
-
- }
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 requestTiXmlDocument 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 pathCoInitialize(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
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。