1. 程式人生 > >Flex與Win32通訊例項之ExternalInterface

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

相關推薦

FlexWin32通訊例項ExternalInterface

專案中要實現Flex開啟資料夾選擇框(Flex做為桌面程式的UI),沒辦法,如果不用AIR只能在下面加一層Container了。網上搜來搜去差不多都是講FSCommand怎樣與VC++互動,可是FSCommand不能及時

Android 元件FragmentActivity通訊小述

一、概述 本節主要介紹一下Fragment與Activity的互動方式,當然方法肯定並不是唯一的,我在這裡只是將自己平時的思路記錄一下,算是拋磚引玉 二、Fragment接收Activity傳遞的資料 我們想從Fragment內獲取它的託管Activity中的資料,這種情況我

EDI其他通訊手段的不同處?

對於剛開始接觸EDI的童鞋們來說,不太理解EDI與現有的一些通訊手段,如傳真、電子信箱(Email)等有什麼不同之處? 具體區別是什麼? EDI傳輸的是格式化標準檔案,並具有格式校驗功能,而傳真和電子郵箱等傳送的是自由格式的檔案; EDI實現的是兩個企業之間業務系統資料的自

HadoopRPC通訊例項

一:RPC(remote procedure call) 不同Java程序間的物件方法的呼叫 一方稱作服務端(server),一方稱作客戶端(client) server端提供物件,供客戶端呼叫的,被呼叫的物件的方法的執行發生在server端 RPC是hadoop框架執行的基礎

IO流學習筆記(二)BufferedWriterBufferedReader及例項Demo

在之前的學習筆記(http://blog.csdn.net/megustas_jjc/article/details/72853059)中,FileWriter與FileReader的Demo使用的中轉資料buf實際就是緩衝區,是由我們自己建立的。 緩衝區可以提高效率,Java對緩衝區進行了封裝,封裝成了物

Vue父子元件間通訊例項講解(props、$ref、$emit)

元件是 vue.js 最強大的功能之一,而元件例項的作用域是相互獨立的,這就意味著不同元件之間的資料無法相互引用。那麼元件間如何通訊,也就成為了vue中重點知識了。這篇文章將會通過props、$ref和 $emit 這幾個知識點,來講解如何實現父子元件間通訊。   在說如何實現通訊

資料倉庫資料探勘Apriori演算法例項

最近剛上了資料探勘這門課,老師講了兩個演算法,即Apriori演算法和FP-growth演算法,然後佈置了上機作業,挖掘一個有8萬行的記錄的retail.dat,需要從中找出強規則,即同時滿足最小支援度和最小置信度的規則。 Apriori演算法 在這裡給出一個實現找出所有頻繁模式集的

網路通訊基礎檢錯糾錯

二維奇偶校驗 迴圈冗餘校驗(CRC) 是一種通過多項式除法檢測錯誤的方法,將每個位元串看作一個多項式,採用模2運算。通常它將位元串:bn-1bn-2bn-3 … b2b1b0解釋成多項式:bn-1xn-1 + bn-2xn-2 + bn-3xn-3 + … + b2x2 + b1x1

EDI是什麼?其他通訊手段有什麼不同處?

對於剛開始接觸EDI的童鞋們來說,不太理解EDI與現有的一些通訊手段,如傳真、電子信箱(Email)等有什麼不同之處? 具體區別是什麼? EDI傳輸的是格式化標準檔案,並具有格式校驗功能,而傳真和電子郵箱等傳送的是自由格式的檔案; EDI實現的是兩個企業之間業務系統資料的自

OpenLayers學習筆記(二)— QMLHTML通訊畫圖

QML與 HTML通訊—實現QML中點選功能按鈕在地圖上畫圖 作者: 狐狸家的魚 Github: 八至  一、HTML-map  var drarGraphic; var drawType;function

領域驅動設計聚合聚合根例項一(訂單)

通過一個例項來說明如何劃分聚合與聚合根 場景:一個下訂單的業務,一個訂單必須有相應的客戶資訊,訂單下有訂單項,每個訂單項必須有相應的產品資訊,產品有分類的資訊。 1.根據這個基本的需求,我們初步確定的實體、值物件與關聯關係為(這裡採用EF的Model First): 2.經過業務深入分析,以及聚合與聚合根

python子程序模組subprocess詳解應用例項

二、應用例項解析 2.1 subprocess模組的使用 1. subprocess.call subprocess.call([“ls”, “-l”]) 0 subprocess.call(“ex

python子程序模組subprocess詳解應用例項

1.2. Popen 物件 Popen類的例項有下列方法: 1. Popen.poll() 檢查子程序是否已經結束,設定並返回返回碼值。 2. Popen.wait() 等待子程序結束,設定並返回返回碼值。 WARNING: 當使用 stdout=P

Fragment學習使用介面回撥的方式實現FragmentActivity通訊

Fragment與Fragment之間可以進行資訊傳遞,同樣,Fragment與Activity也可以進行資訊的傳遞。 下面是一個演示在Activity中獲取來自Fragment的資訊,使用介面回撥的方法在Activity中接收資訊 MainActivity.java:

馳騁工作流引擎JFlowactiviti的對比4種包含多例項的模式

無同步的多例項(MIwithout) 在流程中,一個活動可以啟用多個例項,每個例項相互獨立,並不需要在後面進行同步。 例子:比如使用者購買了N本書,於是後續的支付賬單、更新客戶可以以本書為單位各自執行。 ACTIVITI 中的支援情況: 支援這種模式,但是不允許在後面進行結束動

Qt Html 通訊 QWebChannel

required QWebChannel文件 Header #include qmake: QT += webchannel Since: Qt 5.4 Inherits:

AIDL使用詳解(三) 客戶端通過AIDL服務端通訊 例項專案

專案簡介 我們要實現一個計算器的功能。 首先實現一個服務端,用於提供計算服務,供客戶端去呼叫。它接受客戶端提供的兩個值,計算之後,返回兩個數之和。 第二,實現客戶端介面進行操作。 第三: 我們命名客戶端和服務端。 第四:定義AIDL,連線客戶

Java Socket實現客戶端服務端通訊例項

首先,建立一個Server.java的伺服器端類package socket; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.PrintWriter; impor

LDD3原始碼分析硬體通訊&中斷處理

作者:劉昊昱 編譯環境:Ubuntu 10.10 核心版本:2.6.32-38-generic-pae LDD3原始碼路徑:examples/short/ 本分析LDD3第9和第10章的示例程式碼short。short涉及的主要知識點有通過I/O埠或I/O記憶體操作裝

Android6.0AMS通過socketzygote通訊建立app程序

轉自:https://blog.csdn.net/love000520/article/details/70230784 前面分析到了ActivityStackSupervisor類中的startActivityUncheckedLocked方法,該方法主要是為要啟動的activity準備一個t