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