Windows API LoadLibrary в Qt



  • Доброго времени суток!
    Пишу программу, в которой имеются библиотеки. Подгружаю библиотеки, во время работы программы, при помощи Виндового АПИ.
    Происходит это следующим образом: на форме имеется кнопка, при нажатии на которую происходит сканирование директории с библиотеками, формируется список библиотек. Далее имена библиотек соединяются с путем к директории(путь абсолютный) и конвертируется в w_char. Далее передается в LoadLibrary.
    При загрузке библиотек, в разные моменты времени появляется ошибка доступа к модулю 126(LoadLibrary). Причем иногда этой ошибки нету. Подскажите в чем проблема, код слота привожу ниже
    @void LibModel::RefreshLibs()
    {
    /* Making path to library directory at the string */
    QString lib_path;
    QStringList str_buf = lib_dir->absolutePath().split('/');
    for (int i=0; i<str_buf.size(); ++i)
    lib_path.append(str_buf.at(i)).append('\');

    qDebug() << "path to lib dir is" << lib_path;

    /* Read files from library directory /
    QStringList libs_list = lib_dir->entryList(QStringList() << "
    .dll", QDir::Files | QDir::NoSymLinks);

    new_row_count = libs_list.size();

    /* Create inner structure, assigned to files in directory */
    lib_struct.resize(new_row_count);
    for (int j=0; j<new_row_count; ++j)
    {
    lib_struct[j].resize(3);
    }

        /* Set new structure for table model */
    

    set();

    /* Fill inner structure */
    if (new_row_count==0)
    qDebug() << "There is no libraries in the directory";
    else
    {
    for (int i=0; i<new_row_count; ++i)
    {
    lib_struct[i][0] = libs_list.at(i);

    QString lib;
    lib = lib_path + lib_struct.at(i).at(0);
    qDebug() << QString("***%1").arg(i) << lib;

    int (GetMathName)(char*);
    int (GetDescription)(char*);

    HMODULE hLib;

    WCHAR* lib_name;
    lib_name = new WCHAR[256];
    lib.toWCharArray(lib_name);

    hLib = LoadLibrary(lib_name);
    if ( hLib == NULL )
    {
    uint error_num = GetLastError();
    qDebug() << error_num;
    lib_struct[i][1] = QString("Error occurs");
    lib_struct[i][2] = QString("%1").arg(error_num);
    }
    else
    {
    char *name, *desc;
    name = new char[512];
    desc = new char[512];

    (FARPROC &)GetMathName = GetProcAddress(hLib, "GetMathName");
    (FARPROC &)GetDescription = GetProcAddress(hLib,"GetDescription");
    
    GetMathName(&name);
    GetDescription(&desc);
    
    lib_struct[i][1] = QString().fromUtf8(name);
    lib_struct[i][2] = QString().fromUtf8(desc);
    

    }

    FreeLibrary(hLib);

    }
    }
    }
    @



    1. Я вас умоляю использовать следующую конструкцию:
      @QString lib = lib_dir->absoluteFilePath(libs_list[i]);
      lib.replace("/", "\");@

    2. Чем плоха "QLibrary":http://qt-project.org/doc/qt-4.8/qlibrary.html ?

    3. На всякий случай добавьте в entryList условие QDir::Readable.

    4. Ошибка скорее всего кроется в том, что функция toWCharArray:
      "This function does not append a null character to the array.":http://qt-project.org/doc/qt-4.8/qstring.html#toWCharArray



  • Я еще жуткий нубас =) По этому и использовал эти строки.
    На счет Qlibrary уже разобрался, спасибо =)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.