npapi plugin_invoke函数返回字符串值的乱码

时间:2012-12-17 08:47:47

标签: plugins safari npapi firebreath

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

}

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

请帮忙。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

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

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

应该是:

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

纠正长度。

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

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

答案 2 :(得分:0)

好的,找到答案! 在HTML代码中:

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

应该是这样的:

var value = plugin.getAddress("hello, just test it\0");
字符串末尾的

需要“\ 0”