2012-12-17 46 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); 
的[鉻較新版本