2012-06-27 1 views
0

Я получаю ошибку JavaScript: Error calling method on NPObject при вызове метода в моем плагине NPAPI в Chrome & Firefox на XP. Выполнение того же кода в Windows 7 с теми же браузерами было успешным.Плагин для сценариев: метод вызова ошибок на NPObject

Я создал плагин Scriptable с использованием NPAPI, до сих пор могу отлаживать метод Invoke моего скриптового объекта. Но я не думаю, что у меня есть контроль после того, как он закончен.
У кого-нибудь есть идеи? Это проблема только в Windows XP?

bool MY_ScriptableObject::Invoke(NPObject*  npobj, 
           NPIdentifier  name,  
           const NPVariant* args,  
           uint32_t   argCount, 
           NPVariant*  result) 
{ 
bool     rc = true; 
char*     wptr = NULL; 

    rc = false; 
    wptr = NULL; 

    if (name == NPN_GetStringIdentifier("getVersion")) 
     { 
     wptr = (NPUTF8*)NPN_MemAlloc(strlen("version:1.0.1") + 1); //Should be freed by browser 
     if (wptr != NULL)              
      { 
      rc = true; 
      memset(wptr, 
        0x00, 
        strlen("version:1.0.1")+1); 
      memcpy(wptr, 
        "version:1.0.1", 
        strlen("version:1.0.1")); 
      STRINGZ_TO_NPVARIANT(wptr, 
           *result); 
      } 
     } 
    return (rc); 
} 

Вот функция HTML, что я выполнение:

function Version() 
{ 
var plugin = document.getElementById("plugin"); 
if (plugin == undefined) 
    { 
    alert("plugin failed"); 
    return; 
    } 
var text = plugin.getVersion(); //Error happens at this line 
alert(text); 
} 
+0

Отформатируйте свой код в значительно понятное состояние, пожалуйста, пожалуйста? –

+0

Я не уверен, что не так, как мой код отформатирован? – hapyfishrmn

+1

Уже сделал это для вас ... –

ответ

1

The (сарказм) удивительный (/ сарказм) вещь о NPAPI в текущих версиях браузеров является то, что если ничего идет не так с вызовом вы автоматически получаете это сообщение об ошибке, даже если плагин в противном случае пытался установить исключение с помощью NPN_SetException.

Мое первое предположение заключалось в том, что вы скомпилировали свой код, ориентированный на более позднюю версию Windows, чем Windows XP; Я не уверен, что это вызовет эту проблему или нет. Я никогда не видел проблемы, которую вы описываете, и у меня есть плагины, работающие на xp, vista и 7 без проблем. Вы также можете попробовать сыграть с плагином FireBreath и посмотреть, есть ли проблема там или нет.

Я бы рекомендовал вам подключить отладчик и установить некоторые точки останова. Начните с NPN_GetValue и убедитесь, что он создает экземпляр вашего NPObject, затем установите точки останова в методах HasMethod и Invoke из NPObject и посмотрите, что попало. Вероятно, что-то там покажет вам, что на самом деле происходит, или, по крайней мере, скажет вам, какой код или не попадает.

+1

Добавление определения препроцессора:/D "WIN32" сделал трюк. Спасибо – hapyfishrmn

+0

рад, что вы это поняли! – taxilian