1

私はいくつかの問題を抱えています、私はxcodeを使用してmac10.8にnpapiプラグインを書き込みます、プラグインに絵を描きたいのですが、NPP_SetWindow(NPPインスタンス、NPWindow * pNPWindow);を介してpNPWindow->windowポインタを取得すると nNPWindow-> windowがNULLであることがわかりました。問題を見つけるために費やす必要がありますが、できません。誰かが私を助けてくれます。申し訳ありませんが、私の英語はとても貧弱です。</ p>

コードはそのようなものです、

    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;
    }
4

2 に答える 2

2

Mac 10.8で使用するものはすべて、カーボンイベントモデルをサポートしないため、ウィンドウは常にNULLになります。CoreGraphics描画モデルを使用しようとしていると仮定すると、描画のためにイベントが発生したときにCGContextRefが取得されます。

Cocoaイベントモデルの詳細については、https://wiki.mozilla.org/NPAPI:CocoaEventModelを参照してください。あなたが持っている他のオプションはCoreAnimationモデルです(firefoxとchromeのInvalidatingCoreAnimationモデルを使用)

10.8で動作し、このような複雑さをすべて抽象化したFireBreathをご覧になることをお勧めします。

于 2012-11-08T17:14:31.700 に答える
0

NPP_SetWindow(NPP npp、NPWindow * pNPWindow)

多くの場合、これが本当の楽しみの始まりです。この関数は、プラグインにどのウィンドウを表示しているかを通知するために呼び出されます。GeckoSDK(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*ウィンドウ」はHWNDを間接参照します。他のプラットフォームでは、同様に適切なタイプとして逆参照されます。

ここでも、NPPnppが最初のパラメーターであることに注意してください。これは、mimetypeも渡されるNPP_Newを除くすべてのNPP関数に当てはまります。PluginInstanceオブジェクトを作成し、それをNPP_Newのnpp-> pdataに割り当てたため、NPP_Newをに転送するための小さなスタブ関数を作成する必要があります。そのオブジェクトのメソッドは、次のようになります。

//設定や破棄を含め、ウィンドウが変更されるたびにブラウザによって呼び出されます

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);
}

ウィンドウでは、SetWindowが呼び出されたときに、HWNDを保存し、ウィンドウをサブクラス化して、独自のウィンドウイベントプロシージャを取得できるようにする必要があります。

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;
}

これらの関数を使用すると、ウィンドウが最初に設定されたときに1つの関数で通知を受け取り、更新が行われるたびに別の関数が呼び出されます。

于 2012-11-08T13:44:08.343 に答える