Russian Qt Forum

Qt => Базы данных => Тема начата: UltraPenguin от Апрель 20, 2015, 16:33



Название: [РЕШЕНО] QIBASE: Driver not loaded
Отправлено: UltraPenguin от Апрель 20, 2015, 16:33
Доброго времени суток!

Есть приложение и dll к нему, юзающая InterBase 9. Вот структура каталогов:
%appdir%/myapp.exe
%appdir%/gds32.dll - взят из папки bin Interbase'a
%appdir%/sqldrivers - все имеющиеся драйвера БД, в т.ч. qsqlibase(d)4.dll
%appdir%/DB/db.dll - собственно dll работы с БД.

Доступа к коду самого приложения нет, только к коду отлаживаемой dll. Работа ведется в MSVS2010 с использованием Qt 4.8.6.

qsqlibase компилировал согласно инструкции тут: http://doc.crossplatform.ru/qt/4.5.0/sql-driver.html#qibase-for-borland-interbase (http://doc.crossplatform.ru/qt/4.5.0/sql-driver.html#qibase-for-borland-interbase)

Вот содержание ibase.pro:
Код:
TARGET = qsqlibase

SOURCES = main.cpp

INCLUDEPATH += C:\CodeGear\InterBase\SDK\include
LIBS += C:\CodeGear\InterBase\SDK\lib_ms\gds32_ms.lib
include(../../../sql/drivers/ibase/qsql_ibase.pri)

include(../qsqldriverbase.pri)

Вот содержание сгенерированного pro файла отлаживаемой dll:
Код:
TEMPLATE = lib
TARGET = db
DESTDIR = ../bin/win32/DB
QT += core gui sql xml
CONFIG += debug
DEFINES += QT_LARGEFILE_SUPPORT QT_SQL_LIB DB_LIB WIN32_LEAN_AND_MEAN QT_XML_LIB QT_DLL
INCLUDEPATH += ./GeneratedFiles \
    . \
    ./GeneratedFiles/Debug \
    ./3rd-party/Info-ZIP \
    ./../!_Groundwork \
    ./../!_Groundwork/App \
    ./3rd-party/ibtr
LIBS += -lws2_32 \
#    -lc:/CodeGear/InterBase/SDK/lib_ms/gds32_ms
# PRECOMPILED_HEADER = StdAfx.h
DEPENDPATH += .
MOC_DIR += ./GeneratedFiles/debug
OBJECTS_DIR += debug
UI_DIR += ./GeneratedFiles
RCC_DIR += ./GeneratedFiles
include(db.pri)
win32:RC_FILE = db.rc

Создание объекта БД:
Код:
db_ = QSqlDatabase::addDatabase(opts_.dbEngine(), uid_);

isValid() возвращает false, а в db_.lastError() "Driver not loaded" и в db_.drivers() "QSQLITE QODBS и другие, кроме QIBASE".
Кто-нибудь сталкивался с подобным?

UPD Dovgon (спасибо ему за это) натолкнул на мысль, что драйвер БД может находиться не в той папке. И действительно он искался только по стандартному пути %QTDIR%/plugins/sqldrivers/.


Название: Re: QIBASE: Driver not loaded
Отправлено: Dovgon от Апрель 21, 2015, 08:36
Пытаешься запустить из Qt creator?


Название: Re: QIBASE: Driver not loaded
Отправлено: UltraPenguin от Апрель 21, 2015, 11:18
Нет. Использую MSVS


Название: Re: QIBASE: Driver not loaded
Отправлено: sociopath от Апрель 21, 2015, 14:07
Есть предположение, что виновата строчка в проектнике драйвера LIBS += C:\CodeGear\InterBase\SDK\lib_ms\gds32_ms.lib . В рантайме скорее всего будет искать либу с именем gds32_ms.dll, а не gds32.dll (ну и соответственно он не находит, и драйвер не грузится).

А вообще не надо гадать на кофейной гуще, а пройтись dependency walker'ом по скомпилированному файлу драйвера, и увидеть, какую именно он библиотеку не подцепил.


Название: Re: QIBASE: Driver not loaded
Отправлено: Dovgon от Апрель 21, 2015, 19:39
Посмотри пути откуда загружаются библиотеки

QApplication a(argc, argv);
qDebug()<<a.libraryPaths();


Название: Re: QIBASE: Driver not loaded
Отправлено: UltraPenguin от Апрель 22, 2015, 11:16
Есть предположение, что виновата строчка в проектнике драйвера LIBS += C:\CodeGear\InterBase\SDK\lib_ms\gds32_ms.lib . В рантайме скорее всего будет искать либу с именем gds32_ms.dll, а не gds32.dll (ну и соответственно он не находит, и драйвер не грузится).

А вообще не надо гадать на кофейной гуще, а пройтись dependency walker'ом по скомпилированному файлу драйвера, и увидеть, какую именно он библиотеку не подцепил.

dependency walker'ом прошелся первым делом, ничего криминального нет, все в наличии. По поводу gds32_ms: точно дело не в этом.


Название: Re: QIBASE: Driver not loaded
Отправлено: UltraPenguin от Апрель 22, 2015, 11:18
Посмотри пути откуда загружаются библиотеки

QApplication a(argc, argv);
qDebug()<<a.libraryPaths();

Хм... QApplication можно использовать в коде dll-ки?