четвер, 3 грудня 2009 р.

How to call NPN functions in NPAPI plugin

For every NPN function used like NPN_GetValue, NPN_Evaluate, NPN_ReleaseVariantValue etc. one has to write a wrapper. First of all we need to save pointer to NPNetscapeFuncs* which is passed to NP_Initalize:

NPNetscapeFuncs* npnfuncs;
NPError NP_Initialize(NPNetscapeFuncs *npnf) {
npnfuncs = npnf;

Then we need to write a wrapper for each function. Here goes an example for NPN_GetValue, NPN_Evaluate, NPN_ReleaseVariantValue:
/* Wrappers for NPN functions */

NPError NP_LOADDS NPN_GetValue(NPP instance, NPNVariable variable, void *value)
return npnfuncs->getvalue(instance, variable, value);

bool NPN_Evaluate(NPP npp, NPObject *npobj, NPString *script,
NPVariant *result)
return npnfuncs->evaluate(npp, npobj, script, result);

void NPN_ReleaseVariantValue(NPVariant *variant)

The procedure entry point ?_Xfunc@tr1@std@@YAXXZ could not be located in the dynamic library MSVCP90D.dll

If you ever see the message "The procedure entry point ?_Xfunc@tr1@std@@YAXXZ could not be located in the dynamic library MSVCP90D.dll" from the program, then one of the solutions is to install the Visual Studio 2008 Service Pack 1. First try installing redistributable version (~4MB) and if this won't help, then try downloading the full version (~800 MB). This bug is caused by mistake from Microsoft which may not be seen on developer's machine, but may appear on client running the software.

If you want to download full installer and install it on machine where there is no access to Internet, then you should better use offline installer.