Пример #1
0
SE_Plugin* SE_DynamicLibManager::loadPluginFromLib(const char* libName)
{
    SE_DynamicLib* dLib = loadDynamicLib(libName);

    if(!dLib)
    {
        return NULL;
    }

    mLoadedLibMap.insert(std::pair<std::string,SE_DynamicLib*>(std::string(libName),dLib));

    SE_Plugin* p = dLib->getPlugin();

    if(!p)
    {
        unloadLib(libName);
    }

    return p;
}
Пример #2
0
static bool readCpl(const QString& cplFilename, FileCatalogDb& db, QReadWriteLock& dbLock)
{
    QLibrary libCpl(cplFilename);
    bool success = libCpl.load();
    if (!success)
    {
        qDebug() << "Unable to load cpl" << cplFilename;
        return false;
    }
    Finalizer unloadLib([&libCpl]() { libCpl.unload(); });
    Q_UNUSED(unloadLib);

    APPLET_PROC proc = (APPLET_PROC) libCpl.resolve("CPlApplet");
    if (!proc)
    {
        qDebug() << "Cannot resolve symbol from" << cplFilename << ": " << libCpl.errorString();
        return false;
    }

    LONG rv = proc(0, CPL_INIT, 0, 0);
    if (rv == 0)
        return false;

    Finalizer callCplExit([&proc] { if (proc) proc(0, CPL_EXIT, 0, 0); });
    Q_UNUSED(callCplExit);

    HMODULE hLibInst = GetModuleHandle(libCpl.fileName().toStdWString().c_str());

    const QString systemPath = getWindowsSystemPath();
    const QDir systemDir(systemPath);
    const QString controlExePath = systemDir.absoluteFilePath("control.exe");

    LONG nDialogs = proc(0, CPL_GETCOUNT, 0, 0);
    if (nDialogs)
        dbLock.lockForWrite();
    for (LONG i = 0; i < nDialogs; i++)
    {
        CPLINFO cplInfo;
        memset(&cplInfo, 0, sizeof(cplInfo));
        proc(0, CPL_INQUIRE, i, reinterpret_cast<LPARAM>(&cplInfo));
        // MSDN documentation says CPL_INQUIRE returns zero upon success.  But, for some reason,
        // it returns non-zero for some cpl (e.g. main.cpl).  We will ignore the return value.

        WCHAR cplNameBuffer[256];
        const int nCopied = LoadStringW(hLibInst, cplInfo.idName, cplNameBuffer, sizeof(cplNameBuffer) / sizeof(WCHAR));
        if (nCopied == 0)
        {
            qDebug() << "Unable to load string for" << libCpl.fileName() << i;
            continue;
        }

        const QString cplName = QString::fromWCharArray(cplNameBuffer, nCopied);
        db.add(cplName, cplName,
               controlExePath,
                { libCpl.fileName() + ",@" + QString::number(i) }
               );
    }
    if (nDialogs)
        dbLock.unlock();

    callCplExit.doNow();

    return true;
}