1

私はこの getValue メソッド + NPclass メソッドを持っています:

static bool hasmethod(NPObject *npobj, NPIdentifier name)
{
    return true;
}
static NPObject* allocate (NPP npp, NPClass *aClass)
{
    return  browser-> createobject(npp, aClass);
}
static bool hasProperty(NPObject *npobj, NPIdentifier name)
{
     return true;
}
static bool getProperty (NPObject *npobj, NPIdentifier name, NPVariant *result)
{
   if (!result) 
       return false;
   INT32_TO_NPVARIANT(50, *result);
   return true;
}
static void deallocate (NPObject *npobj)
{
   browser -> memfree(npobj);
}
static bool enumerate(NPObject *npobj, NPIdentifier **value, uint32_t *count)
{
    return false;
}
static bool defaultInvoke(NPObject* obj, const NPVariant *args, uint32_t argCount,     NPVariant *result)
{
    if (!result) 
    return false;
    INT32_TO_NPVARIANT(42, *result);
    return true;
}
static bool setProperty (NPObject *npobj, NPIdentifier name, const NPVariant *value)
{
    return false;
}  
static void invalidate(NPObject *npobj)
{
}
static bool removeProperty (NPObject *npobj,NPIdentifier name)
{
    return false;
}
NPError NPP_GetValue(NPP instance, NPPVariable variable, void *value)
{
    if (! instance)
    {
        return NPERR_INVALID_INSTANCE_ERROR;
    }
struct NPClass class;
class.structVersion = NP_CLASS_STRUCT_VERSION;
class.construct = NULL;
class.deallocate = deallocate;
class.hasMethod = hasmethod;
class.getProperty= getProperty;
class.enumerate= enumerate;
class.removeProperty= removeProperty;
class.hasProperty = hasProperty;
class.invoke = pinvoke;
class.invokeDefault = defaultInvoke;
class.invalidate = invalidate;
class.setProperty = setProperty;
class.allocate = allocate;
if (variable == NPPVpluginScriptableNPObject)
{
    void **v = (void **)value;
    struct NPObject *object = NPN_CreateObject(instance, &class);
    NPN_RetainObject(object);
    *v = object;
    return NPERR_NO_ERROR;
}
return NPERR_GENERIC_ERROR;
}

クラスが指す他の 2 つのメソッドを次に示します。

 bool hasmethod(NPObject *npobj, NPIdentifier name)
 {
     return true;
 }

static bool pinvoke(NPObject* obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result)
{
    if (!result) 
    return false;
    INT32_TO_NPVARIANT(32, *result);
    return true;
}

基本的に、テストのために何かが呼び出されたときにオブジェクトが 32 を返すようにしたかったのです。

これが私の作成と保持の方法です:

NPObject *NPN_CreateObject(NPP npp, NPClass *aClass)
{
    return browser->createobject(npp, aClass);
}

NPObject *NPN_RetainObject(NPObject *npobj)
{
    return browser->retainobject(npobj);
}

私のJavascriptで:

        <embed type="application/x-my-extension" id="pluginId">
            <script>
            var plugin = document.getElementById("pluginId");
            console.log(plugin.something);

ウィンドウはページに描画されますが、コンソールの出力は未定義です。助けていただければ幸いです。ありがとう!

更新: Georg は、アロケート メソッドの無限再帰が原因でブラウザーがクラッシュすることを示唆しました。これが新しいものです:

 void* NPN_MemAlloc(uint32_t size)
 {
     return browser->memalloc(size);
 }
 static NPObject* allocate (NPP npp, NPClass *aClass)
 {
   NPObject* object = (NPObject*)NPN_MemAlloc(sizeof(NPObject));
   if (!object)
   {
    return NULL;
   }
   memset(object, 0, sizeof(NPObject));
   return object;
 }

プラグインはまだクラッシュします。

更新 2: オブジェクトをインスタンス固有にしました

typedef struct PluginInstance {
  NPP npp;
  NPWindow window;
  NPObject *object;
}PluginInstance;

私の NPP_New メソッドでは、

 PluginInstance *newInstance = (PluginInstance*)malloc(sizeof(PluginInstance));
 bzero(newInstance, sizeof(PluginInstance));
 newInstance -> object = NPN_CreateObject(instance, &class);
 newInstance->npp = instance;
 instance->pdata = newInstance;

私のgetValueメソッドでは:

    NPObject* obj = ((PluginInstance *) (instance->pdata)) -> object;
    void **v = (void **)value;
    NPN_RetainObject(obj);
    *v = obj;

まだ同じ問題

4

1 に答える 1

1

関数の一部を記入するだけでなくNPClass、特に不足しているhasPropertygetProperty。ブラウザは他の不足している機能を処理するかもしれませんが、私が知る限り、それらは必須ではありません。

またNPP_GetValue()、のスクリプト可能なオブジェクトのみを返す必要があることに注意してくださいvariable == NPPVpluginScriptableNPObject
次に、プラグインインスタンスごとにスクリプト可能なオブジェクトを作成する必要があり(プラグインの複数のインスタンスを同時に実行できることに注意してください)、プラグインがなくなっNPN_Release()たときにスクリプト可能なオブジェクトを忘れないでください。
pinvoke()次のように改善できます。

static bool pinvoke(NPObject* obj, NPIdentifier methodName, const NPVariant *args, 
                    uint32_t argCount, NPVariant *result)
{
    if (!result) 
        return false;
    INT32_TO_NPVARIANT(32, *result);
    return true;
}
于 2012-07-26T09:19:09.540 に答える