2012-11-08 3 views
1

xcode를 사용하여 xcode에서 macp10i 플러그인을 작성하고 플러그인에서 그림을 그리지 만 NPP_SetWindow (NPP)를 통해 pNPWindow-> window 포인터를 얻을 때 문제가 있습니다. 인스턴스, NPWindow * pNPWindow); 내가 nNPWindow-> 설정창이 NULL, 내가 문제를 찾기 위해 반드시 지출,하지만 난, 누군가가 나를 도울 수 없습니다 것을 찾을 수 있습니다. 죄송합니다, 내 영어 가난.NPAPI 플러그인이 mac10.8에서 개발되었습니다.

코드는 그와 같다

NPError NPP_New(NPMIMEType pluginType, NPP instance, uint16_t mode, int16_t argc, char*  argn[], char* argv[], NPSavedData* saved) 
    { 
     if(instance == NULL) 
      return NPERR_INVALID_INSTANCE_ERROR; 

     CPlugin *plugin = new CPlugin(instance); 
     if(plugin == NULL) 
      return NPERR_OUT_OF_MEMORY_ERROR; 
     instance->pdata = (void *)plugin; 

     NPBool supportsCG = false; 
     NPError err; 
     err = browser->getvalue(instance, NPNVsupportsCoreGraphicsBool,&supportsCG); 

     if (err == NPERR_NO_ERROR && supportsCG) 
      browser->setvalue(instance,NPPVpluginDrawingModel,(void*)NPDrawingModelCoreGraphics); 

     return NPERR_NO_ERROR; 
    } 

    NPError NPP_SetWindow(NPP instance, NPWindow* pNPWindow) 
    { 
     if(instance == NULL) 
      return NPERR_INVALID_INSTANCE_ERROR; 
     if(pNPWindow == NULL) 
      return NPERR_GENERIC_ERROR; 

     if(pNPWindow->window) 
      writelog("window != NULL"); 

     if(pNPWindow->window == NULL) //this is he problem pNPWindow->window always NULL 
      writelog("window == NULL"); 

     return NPERR_NO_ERROR; 
    } 

답변

2

Mac 10.8에서 사용하려는 모든 항목은 탄소 이벤트 모델을 지원하지 않으므로 창이 항상 NULL입니다. CoreGraphics 드로잉 모델을 사용하려는 경우 이벤트가 발생할 때 CGContextRef가 표시됩니다.

코코아 이벤트 모델에 대한 자세한 내용은 https://wiki.mozilla.org/NPAPI:CocoaEventModel을 참조하십시오. 당신이 다른 옵션은 10.8에서 작동하고 당신을 위해이 물건의 합병증을 모두 추상화 FireBreath 한 번 봐 걸릴 수도 있습니다

합니다 (InvalidatingCoreAnimation 파이어 폭스에서 모델과 크롬)이 CoreAnimation 모델입니다.

+1

현대적인 브라우저에서 플러그인을 32 비트 플러그인으로 사용하려면 CoreGraphics 드로잉 모델과 함께 Cocoa 이벤트 모델을 협상해야합니다. Cocoa 이벤트 모델 동작 (NULL 윈도우 포인터)을보고 있었지만 게시 한 코드에 Cocoa 협상이 없으므로 64 비트로 테스트 한 것 같습니다. Cocoa는 64 비트에서 기본값이지만 32 비트가 아니기 때문에 Chrome에서 또는 플러그인을 32 비트 모드로 실행하는 사람들을 위해 플러그인을 사용하려면 두 가지 모두에 대해 컴파일해야합니다. – smorgan

+0

아주 좋은 지적 – taxilian

0

NPP_SetWindow (NPP npp, NPWindow * pNPWindow)

많은 사람들에게 이것은 실제 재미가있는 곳입니다. 플러그인이 어떤 창에 있는지 알려주는 함수입니다. Gecko SDK (npapi.h)에서 :

typedef struct _NPWindow 
{ 
    void* window; /* Platform specific window handle */ 
      /* OS/2: x - Position of bottom left corner */ 
      /* OS/2: y - relative to visible netscape window */ 
    int32 x;  /* Position of top left corner relative */ 
    int32 y;  /* to a netscape page.     */ 
    uint32 width; /* Maximum window size */ 
    uint32 height; 
    NPRect clipRect; /* Clipping rectangle in port coordinates */ 
       /* Used by MAC only.   */ 
    void * ws_info; /* Platform-dependent additonal data, linux specific */ 
    NPWindowType type; /* Is this a window or a drawable? */ 
} NPWindow; 

이 구조에 대한 포인터가 호출 될 때마다 전달됩니다. 창에서 "void * window"는 HWND를 참조합니다. 다른 플랫폼에서도 마찬가지로 적절한 유형으로 역 참조됩니다.

다시 NPP npp가 첫 번째 매개 변수입니다. 이것은 mimetype도 전달되는 NPP_New를 제외한 모든 NPP 함수에서 발생합니다. PluginInstance 객체를 생성하고이를 NPP_New의 npp-> pdata에 할당 했으므로 NPP_New를 전달하기 위해 작은 스텁 함수를 생성해야합니다. 그래서 같은 객체에있어서,

// SetWindow은 우리가 HWND을 저장할 필요가 호출 될 때 창을 설정하거나 창에

NPErrorNPP_SetWindow (NPP npp, NPWindow* pNPWindow) 
{ 
    if (npp == NULL) 
     return NPERR_INVALID_INSTANCE_ERROR; 
    else if (npp->pdata == NULL) 
     return NPERR_GENERIC_ERROR; 

    PluginInstance *inst = (PluginInstance *)npp->pdata; 
    return inst->NpapiSetWindow(pNPWindow); 
} 

를, 파괴를 포함하여, 변경 될 때마다 브라우저에 의해 불려 우리 자신의 창 이벤트 proc를 얻을 수 있도록 창을 서브 클래스 화하십시오.

NPError PluginInstance :: NpapiSetWindow (NPWindow * pNPWindow) { NPError의 RV = NPERR_NO_ERROR;

if(pNPWindow == NULL) 
    return NPERR_GENERIC_ERROR; 

// window just created; in initWindow, set initialized to true 
if(!this->initialized) { 
    if(!this->initWindow(pNPWindow)) { 
     return NPERR_MODULE_LOAD_FAILED_ERROR; 
    } 
} 

// Window was already created; just pass on the updates 
this->updateWindow(pNPWindow); 

return rv; 
} 

이 함수를 사용하면 창을 처음 설정할 때 한 함수에서 알림을 받고, 업데이트 할 때마다 다른 함수를 호출합니다.

관련 문제