Задать вопрос
Slavka_online
@Slavka_online
Интересная личность

Использование функций из Dll бибилеотеки?

QDir path;
    QLibrary myLib("C:\\Windows\\SysWOW64\\regsvr32\\Adaptor.dll");
    if(!myLib.load())
        qDebug()<<"Error";

     void (*myFunction)()  = myLib.resolve("OpenConnection");
     if (!myFunction)
          qDebug() << "NULL";
         //if (myFunction())
          //     qDebug() << "Error";

библиотеку регистрирывал через regsvr32 и "Error" перестало выводится, но указатель на функцию все равно не создается.
  • Вопрос задан
  • 452 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Возникает вопрос. Это простой DLL с торчащими наружу функциями или COM?
• QLibrary — для DLL.
• regsvr32 — это для COM.
• Первый раз не загрузилось и второй раз загрузилось, потому что 32-битные программы со стандартным манифестом принимают каталог «SysWOW64» за «System32». Когда DLL не найден, программа отыскивает его в некоторых стандартных местах и таковыми, возможно, являются и активные COM-серверы.
• OpenConnection мог не найтись по адовой куче причин. Может оказаться, что имя OpenConnection «покозявлено» и надо что-то типа «OpenConnection@4». Может оказаться, что библиотека — действительно COM-сервер и QLibrary тут бесполезен.
Ответ написан
petermzg
@petermzg
Самый лучший программист
1. Если это COM библиотека, что может регистрироваться через regsvr32, то вам должны быть доступны следующие функции.
DllCanUnloadNow, DllGetClassObject, DllRegisterServer, DllUnregisterServer
Через DllGetClassObject можно создать COM обьект, зная его IID.
Если это обычная библиотека, то тогда может быть и OpenConnection. (Хотя разработчики могут и с COM серверами экспортировать иные функции, но как правило это не делают)
2. Если COM сервер правильно зарегистрирован, то не нужно загружать библиотеку самостоятельно, можно создать обьект через CoCreateInstance
3. Если это обычная библиотека, то вы можете ее загрузить только если она соотвествует разрядности текущего процесса. То есть 32х битные, только 32х битными приложениями, а 64х только из 64х битного.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы