외부 API 예제: ActionScript와 ActiveX 컨트롤을 사용하는 데스크톱 응용 프로그램 간의 통신Flash Player 9 이상 이 예제는 외부 API를 사용하여 ActionScript와 ActiveX 컨트롤을 사용하는 데스크톱 응용 프로그램 간에 통신하는 방법을 보여 줍니다. 이 예제에서는 ActionScript 코드 및 동일한 SWF 파일을 비롯한 Introvert IM 응용 프로그램을 다시 사용합니다. 따라서 ActionScript에서 외부 API를 사용하는 방법은 설명하지 않습니다. 앞의 예제와 비슷하므로 이해하는 데 도움이 될 것입니다. 이 예제에서는 데스크톱 응용 프로그램이 Microsoft Visual Studio .NET을 사용하여 C#로 작성됩니다. 여기에서는 ActiveX 컨트롤을 사용하여 외부 API로 작업하는 특정 기술을 중심으로 설명합니다. 이 예제에서는 다음 내용을 보여 줍니다.
이 샘플에 대한 응용 프로그램 파일을 가져오려면 www.adobe.com/go/learn_programmingAS3samples_flash_kr를 참조하십시오. Introvert IM C# 파일은 Samples/IntrovertIM_CSharp 폴더에 있습니다. 이 응용 프로그램은 다음과 같은 파일로 구성됩니다.
Introvert IM C# 응용 프로그램 개요이 샘플 응용 프로그램은 서로 통신하는 두 가지 인스턴트 메시징 클라이언트 프로그램(SWF 파일에 포함된 프로그램과 Windows Forms로 작성된 프로그램)을 나타냅니다. 사용자 인터페이스에는 Shockwave Flash ActiveX 컨트롤의 인스턴스가 포함되며 이 인스턴스에서 ActionScript IM 클라이언트를 포함하는 SWF 파일이 로드됩니다. 이 인터페이스에는 메시지 입력 필드(MessageText), 클라이언트 간에 전송된 메시지 사본의 표시 필드(Transcript), SWF IM 클라이언트에 설정된 가용성 상태를 표시하는 세 번째 필드(Status) 등 Windows Forms IM 클라이언트를 구성하는 각종 텍스트 필드도 들어 있습니다. Shockwave Flash ActiveX 컨트롤 포함Windows Forms 응용 프로그램에 Shockwave Flash ActiveX 컨트롤을 포함하려면 먼저 Microsoft Visual Studio 도구 상자에 추가해야 합니다. 도구 상자에 컨트롤을 추가하려면
ActionScript와 ActiveX 컨테이너의 통신에 대한 이해ActiveX 컨테이너 응용 프로그램에서 외부 API를 사용하여 통신하면 한 가지 중요한 차이만 제외하고 웹 브라우저와 통신하는 것과 비슷하게 작동합니다. 앞에서 설명한 것처럼 개발자와 관련하여 말하자면, ActionScript가 웹 브라우저와 통신하는 경우 함수가 직접 호출됩니다. 플레이어와 브라우저 간에 함수 호출과 응답을 전달하기 위해 형식을 지정하는 방법은 표시되지 않습니다. 그러나 외부 API를 사용하여 ActiveX 컨테이너 응용 프로그램과 통신할 때 Flash Player에서는 메시지(함수 호출 및 반환 값)를 특정 XML 형식으로 응용 프로그램에 전송하고 컨테이너 응용 프로그램의 함수 호출과 반환 값이 같은 XML 형식을 사용하도록 합니다. ActiveX 컨테이너 응용 프로그램의 개발자는 적절한 형식의 함수 호출과 응답을 이해하고 만들 수 있는 코드를 작성해야 합니다. Introvert IM C# 예제에는 메시지 형식을 지정할 수 없는 클래스 집합이 포함되어 있습니다. 그 대신 ActionScript 함수를 호출하고 ActionScript에서 함수 호출을 수신할 때 표준 데이터 형식을 사용할 수 있습니다. ExternalInterfaceProxy 클래스는 다른 도우미 클래스와 함께 이 기능을 제공하며 모든 .NET 프로젝트에서 다시 사용하여 외부 API 통신을 사용하도록 도울 수 있습니다. 기본 응용 프로그램 양식(AppForm.cs)에서 인용한 다음 코드 부분은 ExternalInterfaceProxy 클래스를 사용하여 이루어지는 간단한 상호 작용을 보여 줍니다. public class AppForm : System.Windows.Forms.Form { ... private ExternalInterfaceProxy proxy; ... public AppForm() { ... // Register this app to receive notification when the proxy receives // a call from ActionScript. proxy = new ExternalInterfaceProxy(IntrovertIMApp); proxy.ExternalInterfaceCall += new ExternalInterfaceCallEventHandler(proxy_ExternalInterfaceCall); ... } ... 이 응용 프로그램은 proxy라는 ExternalInterfaceProxy 인스턴스를 선언하고 만든 다음 사용자 인터페이스(IntrovertIMApp)에 있는 Shockwave Flash ActiveX 컨트롤에 대한 참조를 전달합니다. 그런 다음 이 코드는 proxy의 ExternalInterfaceCall 이벤트를 수신할 수 있도록 proxy_ExternalInterfaceCall() 메서드를 등록합니다. Flash Player에서 함수 호출이 오면 ExternalInterfaceProxy 클래스에서 이 이벤트를 전달합니다. 이 이벤트를 구독하는 것이 C# 코드가 ActionScript의 함수 호출을 수신하고 응답하는 방식입니다. ActionScript에서 함수 호출이 오면 ExternalInterfaceProxy 인스턴스(proxy)에서 호출을 수신하고, XML 형식의 이 호출을 변환한 다음 proxy의 ExternalInterfaceCall 이벤트에 대한 리스너 객체에게 알립니다. AppForm 클래스의 경우 proxy_ExternalInterfaceCall() 메서드가 다음과 같이 해당 이벤트를 처리합니다. /// <summary> /// Called by the proxy when an ActionScript ExternalInterface call /// is made by the SWF /// </summary> private object proxy_ExternalInterfaceCall(object sender, ExternalInterfaceCallEventArgs e) { switch (e.FunctionCall.FunctionName) { case "isReady": return isReady(); case "setSWFIsReady": setSWFIsReady(); return null; case "newMessage": newMessage((string)e.FunctionCall.Arguments[0]); return null; case "statusChange": statusChange(); return null; default: return null; } } ... 메서드가 ExternalInterfaceCallEventArgs 인스턴스를 받습니다(예제의 인스턴스 이름은 e). 그러면 이 객체가 ExternalInterfaceCall 클래스의 인스턴스인 FunctionCall 속성을 갖게 됩니다. ExternalInterfaceCall 인스턴스는 두 가지 속성이 있는 간단한 value 객체입니다. FunctionName 속성에는 ActionScript ExternalInterface.Call() 문에 지정된 함수 이름이 포함되어 있습니다. ActionScript에 추가된 매개 변수는 ExternalInterfaceCall 객체의 Arguments 속성에 포함됩니다. 이 경우 이벤트를 처리하는 메서드는 트래픽 관리자처럼 작동하는 switch 문일 뿐입니다. FunctionName 속성의 값(e.FunctionCall.FunctionName)에 따라 호출할 AppForm 클래스의 메서드가 결정됩니다. 앞의 코드 샘플에서 switch 문의 분기는 일반적인 메서드 호출 시나리오를 보여 줍니다. 예를 들어 모든 메서드는 ActionScript에 값을 반환하거나(예: isReady() 메서드 호출) 다른 메서드 호출에서와 같이 null을 반환해야 합니다. ActionScript에서 전달되는 매개 변수에 액세스하는 방법은 newMessage() 메서드 호출(Arguments 배열의 첫 번째 요소인 매개 변수 e.FunctionCall.Arguments[0]와 함께 전달)에 표시됩니다. ExternalInterfaceProxy 클래스를 사용하여 C#에서 ActionScript 함수를 호출하면 ActionScript에서 함수 호출을 수신하는 것보다 간단합니다. ActionScript 함수를 호출하려면 다음과 같이 ExternalInterfaceProxy 인스턴스의 Call() 메서드를 사용합니다. /// <summary> /// Called when the "Send" button is pressed; the value in the /// MessageText text field is passed in as a parameter. /// </summary> /// <param name="message">The message to send.</param> private void sendMessage(string message) { if (swfReady) { ... // Call the newMessage function in ActionScript. proxy.Call("newMessage", message); } } ... /// <summary> /// Call the ActionScript function to get the current "availability" /// status and write it into the text field. /// </summary> private void updateStatus() { Status.Text = (string)proxy.Call("getStatus"); } ... } 이 예제에서 보듯이 ExternalInterfaceProxy 클래스의 Call() 메서드는 ActionScript의 ExternalInterface.Call()과 매우 비슷합니다. 첫 번째 매개 변수는 문자열로, 호출할 함수 이름입니다. 추가 매개 변수(여기에는 표시되지 않음)는 ActionScript 함수로 전달됩니다. ActionScript 함수가 값을 반환하면 앞의 예제와 같이 Call() 메서드에서 이 값을 반환합니다. ExternalInterfaceProxy 클래스 내부ActiveX 컨트롤 주위에 프록시 래퍼를 사용하는 것이 항상 유용하지는 않으며, 예를 들어 다른 프로그래밍 언어로 또는 다른 플랫폼에 맞게 직접 proxy 클래스를 작성하려는 경우가 있을 수 있습니다. 프록시를 만드는 데 대한 모든 정보가 설명되어 있지는 않지만 이 예제에서는 proxy 클래스가 내부적으로 작동하는 방식을 이해할 수 있도록 설명합니다. Shockwave Flash ActiveX 컨트롤의 CallFunction() 메서드를 사용하여 ActiveX 컨테이너에서 외부 API를 통해 ActionScript 함수를 호출합니다. ExternalInterfaceProxy 클래스의 Call() 메서드에서 추출한 다음 예제는 이 방법을 보여 줍니다. // Call an ActionScript function on the SWF in "_flashControl", // which is a Shockwave Flash ActiveX control. string response = _flashControl.CallFunction(request); 이 코드 인용문에서 _flashControl은 Shockwave Flash ActiveX 컨트롤입니다. CallFunction() 메서드를 사용하여 ActionScript 함수가 호출됩니다. 이 메서드는 하나의 매개 변수(이 예제에서는 request)를 사용합니다. 이 매개 변수는 호출할 ActionScript 함수 이름 및 모든 매개 변수 등 XML 형식의 명령을 포함하는 문자열입니다. ActionScript의 반환값은 XML 형식의 문자열로 인코딩된 다음 CallFunction() 호출의 반환값으로 다시 전송됩니다. 이 예제에서는 이 XML 문자열이 response 변수에 저장됩니다. ActionScript에서 함수 호출을 수신하는 것은 여러 단계의 프로세스입니다. ActionScript에서 함수가 호출되면 Shockwave Flash ActiveX 컨트롤이 해당 FlashCall 이벤트를 전달하므로 SWF 파일에서 호출을 수신하려는 클래스(예: ExternalInterfaceProxy 클래스)는 해당 이벤트의 핸들러를 정의해야 합니다. ExternalInterfaceProxy 클래스에서 이벤트 핸들러 함수의 이름이 _flashControl_FlashCall()로 지정되고 다음과 같이 클래스 생성자에서 이벤트를 수신할 수 있도록 등록됩니다. private AxShockwaveFlash _flashControl; public ExternalInterfaceProxy(AxShockwaveFlash flashControl) { _flashControl = flashControl; _flashControl.FlashCall += new _IShockwaveFlashEvents_FlashCallEventHandler(_flashControl_FlashCall); } ... private void _flashControl_FlashCall(object sender, _IShockwaveFlashEvents_FlashCallEvent e) { // Use the event object's request property ("e.request") // to execute some action. ... // Return a value to ActionScript; // the returned value must first be encoded as an XML-formatted string. _flashControl.SetReturnValue(encodedResponse); } 이벤트 객체(e)에는 함수 이름과 매개 변수 등 함수 호출에 대한 XML 형식의 정보를 포함하는 문자열인 request 속성(e.request)이 있습니다. 컨테이너에서는 이 정보를 사용하여 실행할 코드를 결정합니다. ExternalInterfaceProxy 클래스에서는 요청이 XML 형식에서 ExternalInterfaceCall 객체로 변환되어 같은 정보를 액세스하기 쉬운 형식으로 제공합니다. ActiveX 컨트롤의 SetReturnValue() 메서드는 ActionScript 호출자에게 함수 결과를 반환하는 데 사용됩니다. 마찬가지로 결과 매개 변수를 외부 API에서 사용하는 XML 형식으로 인코딩해야 합니다. Shockwave Flash ActiveX 컨트롤을 호스팅하는 ActionScript와 응용 프로그램 간의 통신은 특정 XML 형식을 사용하여 함수 호출과 값을 인코딩합니다. Introvert IM C# 예제에서는 ExternalInterfaceProxy 클래스를 통해 응용 프로그램 양식의 코드가 ActionScript에 대해 송수신된 값을 직접 연산하고 Flash Player에서 사용되는 세부 XML 형식을 무시하도록 할 수 있습니다. 그렇게 하기 위해 ExternalInterfaceProxy 클래스는 ExternalInterfaceSerializer 클래스의 메서드를 사용하여 XML 메시지를 실제로 .NET 객체로 변환합니다. ExternalInterfaceSerializer 클래스에는 다음 네 가지 공용 메서드가 있습니다.
이러한 메서드는 C# 값을 외부 API의 XML 형식으로 인코딩하고 XML을 C# 객체로 디코딩합니다. Flash Player에서 사용하는 XML 형식에 대한 자세한 내용은 외부 API의 XML 형식을 참조하십시오. |
|