2012-12-17 44 views
1

NPAPI代码:NPAPI plugin_invoke函数返回的字符串值乱码

bool plugin_invoke(NPObject *obj, NPIdentifier methodName, const NPVariant *args, uint32_t argCount, NPVariant *result) { 
NPUTF8 *name = browser->utf8fromidentifier(methodName); 
if(strcmp(name, plugin_method_name_getAddress) == 0){ 
    NPString password; 
    if(argCount > 0) { 
     password = NPVARIANT_TO_STRING(args[0]); 
    } 
    const char * StringVariable = password.UTF8Characters; 
    char* npOutString = (char *)malloc(strlen(StringVariable+1)); 
    if (!npOutString) 
     return false; 
    strcpy(npOutString, StringVariable); 
    STRINGZ_TO_NPVARIANT(npOutString, *result); 
    browser->memfree(name); 
    return true; 
} 
return false; 

}

的html代码:

function run() { 
    var plugin = document.getElementById("pluginId"); 
    var passwordBeforEncryption = document.getElementById("passwordFeild"); 
    if(plugin){ 
     var value = plugin.getAddress("hello, just test it"); 
      alert(value); 
    }else{ 
     alert("plugin is null"); 
    } 

}

正确的结果应该是:“你好,只是测试它“,但有时会返回”你好,只是测试它“。它只是有时候不是所有的时间!

请帮忙。

+0

可能重复(14)不给一个空值终止字符串的一部分NPVariant](http://stackoverflow.com/questions/7807917/chrome-newer-version14-does-not-give-a-null-terminated-string-as-part-of-npvar) – smorgan

回答

2

的错误不是在你的HTML,你shuld看到NPString结构体。

typedef struct _NPString { 
    const NPUTF8 *UTF8Characters; 
    uint32_t UTF8Length; 
} NPString; 

成员UTF8Length表明您字符串的长度,所以你应该如下做:

const char * StringVariable = password.UTF8Characters; 
char* npOutString = (char*)browser->memalloc(password.UTF8Length+1); 
if (!npOutString) { 
    return false; 
} 
memcpy(npOutString , password.UTF8Characters, password.UTF8Length); 
npOutString[password.UTF8Length] = 0; 
+0

谢谢你告诉我真正的问题,并给我演示代码! – justin

0

好的,喜欢这个答案! 在HTML代码:

var value = plugin.getAddress("hello, just test it"); 

应该是这样的:

var value = plugin.getAddress("hello, just test it\0"); 

在字符串末尾需要 “\ 0”

+2

这工作,但真正的问题是你的插件代码是错误的。您应该使用字符串长度(请参阅重复问题),而不是假定它是以空字符结尾的字符串。 – smorgan

+0

谢谢你告诉我真正的问题! – justin

1

看起来你被错误地分配内存:

char* npOutString = (char *)malloc(strlen(StringVariable+1)); 

应该是:

char* npOutString = (char *)malloc(strlen(StringVariable)+1); 

更正长度。

然而,为了使浏览器能够释放内存,你应该使用:

char* npOutString = (char *)NPN_MemAlloc(strlen(StringVariable)+1); 
的[铬较新版本