Chrome扩展程序具有FireBreath插件...未捕获错误:在NPObject上调用方法时出错

时间:2013-04-30 23:53:17

标签: c++ windows dll google-chrome-extension firebreath

我最深切的道歉。该文件未复制到正确的目录中,因此无法读取。毕竟,扩展适用于所有Windows平台。这提醒您始终执行正确的错误处理。

直接问题:对于Chrome扩展程序中的FireBreath插件,我是否需要为FireBreath生成的.dll文件(需要正确的.js,.html和.json)上传多个文件?

大图: FireBreath生成.dll,我相信将此.dll文件加载到我使用chrome上传的Chrome扩展程序文件夹中:// extensions / unpacked就足够了。换句话说,我认为我不需要上传额外的C ++代码。调用 plugin.openUserIdFromFile()会生成我的错误。

成功:我使用NPAPI FireBreath插件将桌面用户名从文件加载到Chrome扩展程序。它适用于开发插件的Windows桌面。

失败: 在NPObject上调用方法时出错。在开发环境之外的所有Windows环境:XP,7或8上都收到错误。

已知:好友在其上运行http://www.dependencywalker.com/软件,发现IEShims.dll在他的环境中缺少依赖,但我将其包含在上传的文件夹中无济于事。

JavaScript Chrome扩展程序调用FireBreath插件dll:

$(document).ready(function () {
    setInterval(getAllChromeTabs, 10000);

    var plugin = document.getElementById("pluginId");

    while (user.length < 1) {
        user = plugin.openUserIdFromFile();
    }
    console.log(user);
});

从Chrome扩展程序调用C ++ FireBreath插件函数:

std::string LabStatsPluginAPI::openUserIdFromFile()
{
    std::string aTempFileName = "aTempFileName";

    DWORD nBufferLength = MAX_PATH;
    LPTSTR lpBuffer = (new TCHAR[nBufferLength]);
    DWORD tempPath = GetTempPath(nBufferLength, lpBuffer);

    char* localTempPathArray = new char[nBufferLength];
    for (int i = 0; i < nBufferLength; i++) {
        localTempPathArray[i] = (char)lpBuffer[i];
    }
    std::string localTempPath(localTempPathArray);
    localTempPath = localTempPath + aTempFileName;

    std::ifstream streamFromFile;
    std::ifstream::pos_type fileSize;
    streamFromFile.open( localTempPath, std::ios::in|std::ios::binary|std::ios::ate );

    char* userNameString;
    int userNamesize = streamFromFile.tellg();
    streamFromFile.seekg(0, std::ios::beg);
    userNameString = new char[userNamesize];
    streamFromFile.read(userNameString, userNamesize);

    delete[] lpBuffer;
    delete[] localTempPathArray;

    std::string userNameSafeString(userNameString);
    delete[] userNameString;

    return userNameSafeString;
}

1 个答案:

答案 0 :(得分:0)

对C ++的以下修改(插入if语句)修复了该函数。

char* userNameString;
int userNamesize = streamFromFile.tellg();
if (userNamesize < 1) {
    return ""; // no file found
}

streamFromFile.seekg(0, std::ios::beg);
userNameString = new char[userNamesize];
streamFromFile.read(userNameString, userNamesize);