1

npapi代码:

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");
    }

}

正确的结果应该是:“hello, just test it”,但有时会返回“hello, just test itÿÿÿÿ”。它只是有时不是所有时间!

请帮忙。

4

3 回答 3

2

错误不在您的 html 中,您应该看到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;
于 2012-12-18T02:25:28.590 回答
1

看起来您分配的内存不正确:

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

应该:

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

纠正长度。

但是,为了让浏览器能够释放内存,您应该使用:

char* npOutString = (char *)NPN_MemAlloc(strlen(StringVariable)+1);
于 2014-05-12T23:30:47.467 回答
0

好的,喜欢答案!在 html 代码中:

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

应该是这样的:

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

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

于 2012-12-17T09:38:38.450 回答