2013-01-12 4 views
1

동일한 dll에서 두 개의 다른 플러그인을 만들 수 있습니까? 하나는 통신용이고 다른 하나는 캔버스로 만들 수 있습니까?동일한 dll에 두 개의 서로 다른 플러그인을 가질 수 있습니다.

나는 같은 클래스에서이 작업을 수행 할 수 있지만 첫 번째 창없는 브라우저 (브라우저 당 하나만 필요함)와 다른 브라우저를 창으로 만들 것을 원한다. (동일한 브라우저에서 최대 4 개까지 만들 수있다.).

나는 그들 사이에서 이것을 선택할 수 있기를 원한다.

<object id="plugin0" type="application/x-communication" width="0" height="0"> 
<param name="onload1" value="pluginLoaded" /> 

<object id="plugin1" type="application/x-canvas" width="320" height="240"> 
<param name="onload2" value="pluginLoaded" /> 

내가 FB : DOM 등을 사용하여 통신 개체에서 동적으로 캔버스 객체를 생성 할 수 JSAPIAUTO 포인터가 직접 사이에 이진 데이터를 전달하는거야?

NpAPI는 바이트 배열을 지원하지 않으며 base64 문자열을 사용하려고했지만 매우 느립니다.

답변

3

예 여러 개의 "플러그인"이있는 단일 DLL을 가질 수 있습니다. 사실 그것은 하나의 플러그인이지만 여러 MIME 유형을 처리 할 수 ​​있습니다. FBTestPlugin 예제를 보면 실제로 3 개의 다른 mimetype을 처리하는 것을 볼 수 있습니다. 이러한 플러그인은 선택적으로 동일한 JSAPI 인터페이스를 공유 할 수 있지만 모두 동일한 메모리 공간에 있으므로 정보를 공유하기 위해 전역 변수를 사용할 수 있습니다 (신중하게!).

"캔버스"개체가 자신의 플러그인 인스턴스라고 가정하면 일종의 식별자와 전역 맵을 사용하여 다른 플러그인 인스턴스에 값을 전달하여 사용할 메모리 블록 등을 알려줄 수 있습니다. javascript를 통해 하나의 JSAPI 객체를 다른 객체로 전달할 수 없으며 (적어도 모든 경우가 아닌) 원시 C++ 객체를 다시 가져올 수는 없지만 찾고있는 객체를 찾을 수있는 식별자를 전달할 수 있습니다.

firebreath repo in the FBTestPlugin project에서 여러 MIME 유형 지원 방법에 대한 메모를 찾을 수 있습니다. 나는 여기에 그것들을 게시 할 것이지만,이 세부 사항 중 일부는 나중에 바뀔 수도있다. ,

  1. 편집 PluginConfig.cmake 다음 항목에 대해 여러 항목을 추가합니다 : FBSTRING_MIMEType, ACTIVEX_PROGID, FBControl_GUID, 단일 코드베이스에 여러 MIME 형식 을 지원하기 위해 다음과 같이


    원래 FBTestPlugin를 수정 FBSTRING_PluginDescription. FBControl_GUID의 GUID를 포함하여 모든 항목에 대해 고유 한 값을 제공해야합니다.

  2. Factory.cpp를 편집하고 PluginFactory :: createPlugin()을 수정하고 코드 을 추가하여 mimetype을 확인하고 적절한 객체를 만듭니다. 또한 "mimetype"을 "boost :: make_shared (mimetype)"의 매개 변수로 추가하십시오. 새로운 코드는 "표준"FBTestPlugin 플러그인 또는 에서 새로운 "SimpleMath"플러그인 (FBTestPlugin 또는 FBTestMathPlugin C++ 객체)을 구성 할 수 있습니다.

  3. FBTestPlugin.h에서 "const std :: string & mimetype"을 인수로 사용하도록 FBTestPlugin 생성자를 수정하십시오. "std :: string m_mimetype;"을 추가하십시오. FBTestPlugin의 전용 변수로 사용됩니다.

  4. FBTestPlugin.cpp에서 "const std :: string & mimetype"을 인수로 사용하고 mimetype 매개 변수를 에서 m_mimetype으로 설정하도록 FBTestPlugin 생성자를 수정하십시오. "boost :: make_shared (m_host)" 대신 을 반환하도록 createJSAPI()를 수정하십시오. "SimpleMath.h"를 포함하십시오. 사용자에 대한 시각적 피드백을 위해 mimetype에 따라 도면 코드에서 플러그인 텍스트를 수정하십시오.

  5. SimpleMathAPI.h 및 SimpleMathAPI.cpp를 수정하여 shared_from_this()를 반환하는 "self"속성 및 "GetSelf()"메서드를 추가합니다.

  6. FBTestPlugin. *을 FBTestMathPlugin. *에 복사하고 개체 이름을 변경하십시오. LeakFinder를 제거하여 FBTestMathPlugin을 단순화하십시오. SimpleMathAPI 객체 만 반환하도록 createJSAPI()를 수정하십시오. 드로잉 코드의 플러그인 텍스트를 수정하여 사용자에게 시각적 피드백을 제공합니다.

  7. 여러 개의 MIME 유형을 테스트하기 위해 test.html의 수정 된 테스트 코드. 세 개의 플러그인을 만들고 세 가지 모두를 사용하여 수학 함수를 테스트하십시오.

+0

정말 감사합니다,하지만 난 정말, 당신은 표준 :지도 을 의미하고 그것을 자기를 등록 캔버스 클래스의 ctor에에 전달 않습니다 "세계지도"를 이해하지? – user1748906

+0

아니요; JSAPI 인스턴스는 인스턴스별로 필요합니다. 그러나 std :: map을 다른 것과 함께 사용할 수 있습니다. 세계적 의미는 그것을 전체 변수로 만든다. – taxilian

관련 문제