swf가 ExternaInterface를 통해 노출하는 메서드 목록을 C#에서 얻을 수있는 방법이 있습니까?C# 및 플래시 통신
답변
swf (소스가 있음)에 액세스 할 수있는 경우 ExternalInterface와 함께 사용하기 위해 설정 한 모든 메소드를 배열, 문자열 등으로 반환하는 함수에 콜백을 추가하면됩니다.
swf 소스에 액세스 할 수없는 경우 다른 swf를 만들 수 있습니다. ExternalInterface로 설정하여 호출 할 수 있습니다. 새로운 swf를로드하고 INIT 핸들러에서 describeType을 사용하여 ExternalInterface.addCallback에 링크 된 메서드 호출을 시작합니다. 당신이로드 SWF가 의 Document, 과 같이 추가 할 수있는 기능이없는
- : 경우
var loader:Loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.INIT, loaded); loader.load(new URLRequest('externalInterfaceTest.swf')); function loaded(e:Event):void{ //get all the methods in the loaded swf var methods:XMLList = describeType(e.target.content).method; for each(var method:XML in methods){ //get methods defined by the author/not belonging to flash.display.*,flash.events.*,etc if([email protected]('flash') == -1){ trace('\nmethod description start========================'); trace('methodName: ' + [email protected]); trace('returnType: ' + [email protected]); for each(var param:XML in method.parameter){ trace('parameter ' + [email protected] + ' type: ' + [email protected] + ' optional: ' + [email protected]); } trace('\nmethod description end\n========================'); } } }
이 작동합니다 :
이
내가 생각하고있는 것입니다 콜백은 이므로 타임 라인이므로 - 로드하는 모든 메서드는 과 연결됩니다. 외부 Interface.addCallback public 공개
swf 또는 개발자에게 액세스 권한이없는 경우 윤리적 인 디 컴파일이 도움이 될 수 있습니다.
다른 접근 방식은 다른 개발자가 개발 한 클래스를 사용하여 swfs를 검사하는 것입니다. 다음은 몇 가지 예입니다 :
는 이러한 클래스는 당신이 필요로하는 정확한 기능을 제공하지 않을 수도 있습니다,하지만 그것은 단지, 당신이 필요위한 좋은 출발점이다 당신은 바이너리 데이터를 사용하여 찾고있을 것이다 (나는 지금 당장 좋지 않다). SWF 파일 사양 here을 찾을 수 있습니다.
희망이 도움이됩니다.
업데이트 :
그냥 당신이 오히려 Shockwave ActiveX control
자체보다 플렉스 ExternalInterface class
를 통해 정의 방법을 찾고 있습니다 나는이 질문을 잘못 해석 한 것을 깨달았다; 일반적으로 C#을 통해 SWF
사용에 관해서는 여전히 도움이 될 수 있으므로 저의 원래 대답은 계속 작성하겠습니다.
ExternalInterface
에 대해서는 아직 답변이 없지만, C#을 통해이 API를 사용하는 방법에 대한 아이디어를 얻으려면 Fun with C# and the Flash Player 8 External API을 참조하십시오. (또 다른 유용한 샘플은 Use External Interface of Flash 8 in Python and C# Applications 일 수 있습니다.)
CallFunction()
에
XML fragments는 여전히 원칙적으로 여기에 조지
solution를 번역 할 수 있어야한다, 다소 황당하다으로 제작 제가 이전 기사에서 읽고 있어요에서
(내가 말했듯이, 그것은 예쁘지 않을 것 같다;)
행운을 빌어 요!
방법은 COM 상호 운용성을 통해 .NET에서 SWF에 액세스하려면 : Windows 용
SWF
가 Adobe Flash PlayerActiveX control에 의해 구현되고, 결과적으로 당신이 COM Interoperability을 통해 .NET에서 그것을 사용할 수 있습니다.
Adobes 사이트에 대한 (유산) 기사/샘플을 확인할 수 있습니다 (예제 코드를 사용할 수 없다는 기사의 소개 노트에 유의하십시오). 아래 내용은 Embedding Macromedia Flash Player in a C# Application to Display Stock Information을 참조하십시오.
더 구체적으로 당신이이 문서의 다른 페이지에 당신의 목표를 달성하기 위해 수행해야 할 초기 단계를 찾을 수 있습니다, Embedding and Communicating with the Macromedia Flash Player in C# Windows Applications 참조 - 특히 섹션 매크로 미디어 플래시 만들기에 포함 기사/단계를 따르십시오 플레이어 ActiveX 컨트롤은 Visual Studio .NET 내에서 사용 가능합니다.
당신이 assembly Interop.ShockwaveFlashObjects
을 강조 Visual Studio object browser을 열 것이다, 당신의 도구 상자에 당신이 단순히 (비주얼 스튜디오 2008에서 ShockwaveFlashObjects
이름)이 참조를 두 번 클릭 할 수있는 특정 프로젝트 참조에 Shockwave ActiveX control
를 추가 할 수있는 설명 된 단계를 완료하면, namespace ShockwaveFlashObjects
으로 이동하십시오. 여기서는 interface IShockwaveFlash
을 찾고 외부 필터 메서드와 각각의 C# 서명을 비롯한 모든 구성원을 (뷰 필터에 따라) 노출합니다.
C# 코드에서 SWF 파일을 읽으면됩니다. 실제와 관련하여 통신하지 않아도됩니다. 이 게시물은 올바른 방향으로 여러분을 안내 할 것입니다. 그러나 할 일이 많이있을 것입니다. 바이트 코드를 디 컴파일하여 어떤 함수가 ExternalInterface.addCallback
에 전달되는지 확인해야합니다.
SWF format과 마찬가지로 ActionScript 바이트 코드 형식은 documented입니다.
안녕하세요, 답장을 보내 주셔서 감사합니다.하지만 "고수준"솔루션을 찾고있었습니다. –
Are'nt 우리 모두 ;;) –
안녕하세요, 고맙지 만 C# 솔루션이 필요합니다. –
오, 당신이 swf를 들여다 보면서 모든 것을 가져 오는 클래스를 의미한다면 # 나는 C#을 사용하지 않기 때문에 모르겠다. 내 솔루션은 swf가 당신을 위해 데이터를 뱉어 버리는 것입니다. –
걱정하지 마십시오, 괜찮습니다. 시간 내 주셔서 감사합니다 .-) –