Я надеюсь, что вы решили это. Если это не так, я только что обнаружил, что пример (я полагаю, это был проклятый «образец npruntime») был ошибочным.
При возврате строки в примере использовалась функция strdup
для выделения строки, переданной методом NP_something.
Факт заключается в том, что NPAPI заботится о выделенной строке с этого момента и, когда пытается уничтожить ее, не может, поскольку strdup
использует malloc
, а не NPN_MemAlloc
.
Решение НИКОГДА не использовать malloc
или новое для объектов, которые мы передаем в функции NPAPI.
В примере npruntime ошибка в строке 452:
STRINGZ_TO_NPVARIANT(strdup("foo return val"), *result);
и строка 466:
STRINGZ_TO_NPVARIANT(strdup("default method return val"), *result);
Я исправил это с помощью этого кода:
char* src = "foo return val";
char* out = (char *)NPN_MemAlloc(strlen(src) + 1);
strcpy(out, src);
STRINGZ_TO_NPVARIANT(out, *result);
и это сработало.
Но можно подумать, что такой недостаток в образце должен быть исправлен сопровождающими Mozilla SDK.