`
noahgenius
  • 浏览: 140466 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Flex与Win32通信实例之ExternalInterface

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

 

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也要写好代码,这里略掉。

  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

分享到:
评论

相关推荐

    flex与js交互 关于ExternalInterface使用的小例子

    标题“flex与js交互 关于ExternalInterface使用的小例子”指出了本文将探讨如何使用Flex的ExternalInterface类与JavaScript进行通信。ExternalInterface是Flex提供的一个API,允许ActionScript(Flex的主要编程语言...

    flex 与 js 通信的小例子

    本篇文章将探讨一个关于“flex与js通信”的小例子,它主要涉及到Adobe Flex和JavaScript之间的交互,这对于创建富互联网应用程序(RIA)是非常重要的。Flex是一种用于构建富客户端应用的开源框架,基于ActionScript...

    Flex与Flash相互调用实例

    本教程通过一个实际的调用实例,展示了Flex与Flash如何相互通信。 Flex是基于ActionScript 3.0的开源框架,主要用于构建富互联网应用程序(RIA)。它提供了MXML和ActionScript语言来创建用户界面,具有强大的组件库...

    SWF之间通信、Flex与SWF之间通信

    ### SWF之间通信、Flex与SWF之间通信 在探讨SWF之间以及Flex与SWF之间的通信时,我们首先需要了解SWF文件的基本概念及其在Adobe Flash平台中的作用。SWF(Shockwave Flash)是一种被广泛应用于网页动画、游戏和其他...

    flex 与JS的通信

    - **ExternalInterface API**: Flex SDK提供了`ExternalInterface`类,允许ActionScript(Flex的编程语言)代码与JavaScript进行双向通信。通过`addCallback`方法注册回调函数,使JavaScript可以调用Flex中的方法,...

    Flash flex与JS通信

    标题中的"Flash Flex与JS通信"指的是如何让运行在Adobe Flash Player中的Flex应用与浏览器中的JavaScript代码进行数据交换和功能调用。这种通信机制通常被称为External Interface或Bridge技术,它允许Flex应用与网页...

    JS与Flex通信、互转例子

    本篇文章将详细讲解JS与Flex之间的通信方式以及互转实例。 首先,我们探讨JS与Flex之间的通信机制。这种通信通常通过两种方式实现:Flash Player的LocalConnection API和使用SWFObject加载的Flex组件。 1. **...

    Flex与JavaScript交互实例

    Flex与JavaScript交互是一种常见的技术,它允许在Adobe Flex(基于ActionScript 3的富互联网应用程序框架)和网页中的JavaScript之间进行通信。这种交互性对于构建混合型应用,特别是在需要利用浏览器内核特性的Web...

    flex和页面js通信1

    总结来说,Flex与JavaScript之间的通信依赖于`ExternalInterface`,它提供了调用JavaScript函数和注册可被JavaScript调用的Flex方法的能力。这种通信方式使得两种技术能够协同工作,为开发者提供更丰富的用户交互...

    Flex与JavaScript的相互通信(真情贡献)

    Flex与JavaScript的相互通信是Web开发中的一个重要技术,它允许富互联网应用程序(RIA)如Flex应用与网页中的JavaScript代码进行交互,实现更丰富的用户体验。本文将深入探讨这一主题,结合给定的压缩包文件...

    js调用flex实例

    在Flex项目中,你需要引入`flash.external.ExternalInterface`库,这样Flex应用才能与JavaScript环境通信。在Flex组件或ActionScript类中,你可以使用`ExternalInterface.addCallback()`方法来注册一个函数,使其可...

    flex与flash cs 交互

    在Flex应用中,可以通过ActionScript 3.0 (AS3)与Flash CS中的AS3代码进行通信。首先,你需要在Flash CS中编写好需要调用的方法,并确保这些方法是公开的。然后,在发布SWF文件时,确保ActionScript版本设置为3.0。...

    Flex与Flash相互调用

    Flex调用Flash函数的机制与Flash调用Flex类似,也是通过`ExternalInterface`。在Flash中,我们需要定义一个可被外部调用的函数: ```as3 public function flashFunction(message:String):void { trace("Flash收到...

    在MFC嵌入Flex并且相互通信

    5. **通信机制**:为了实现MFC与Flex之间的通信,可以利用Flash Player的ExternalInterface接口。在Flex端,我们可以注册ActionScript函数,使其能在JavaScript中调用,然后通过MFC调用JavaScript函数来实现通信。在...

    flex与JS交互示例

    1. **ExternalInterface**: 这是Flex提供的一种API,允许ActionScript代码调用JavaScript函数,同时也允许JavaScript调用Flex组件的方法。在使用ExternalInterface之前,需要确保在Flex应用中启用它,这可以通过在...

    js flex通信代码示例

    - Adobe提供了一个叫做`Flash Player External Interface`(简称ExternalInterface)的API,它允许Flex应用与JavaScript进行通信。Flex端通过调用这个接口,可以暴露方法给JavaScript,反之亦然。 2. **在Flex中...

    flex和javascript交互例子

    在Flex中,我们可以使用`ExternalInterface`类来与JavaScript进行交互。`ExternalInterface.addCallback`方法允许我们在JavaScript中调用Flex组件的方法,而`ExternalInterface.call`方法则用于在Flex中调用...

    ExternalInterface

    除了上述核心功能外,`ExternalInterface`还提供了一系列标准的`Object`原型方法,如`hasOwnProperty`、`isPrototypeOf`、`...提供了对`ExternalInterface`实例的进一步控制和操作能力...

    flex与js交互2

    本文将详细介绍如何使用ExternalInterface接口实现Flex与JavaScript之间的相互调用,并给出具体的示例代码。 #### 二、Flex调用JavaScript方法 在Flex中调用JavaScript是一种常见的需求,这使得Flex能够利用网页中...

    Flex4.5 与js,ocx相互调用

    在 Flex 应用程序中,通过 ExternalInterface API 可以与 JavaScript 进行通信。ExternalInterface 提供了一种方法,使得 Flex 中的 ActionScript 代码能够调用网页中的 JavaScript 函数,反之亦然。这种交互允许 ...

Global site tag (gtag.js) - Google Analytics