Russian Qt Forum

Qt => Общие вопросы => Тема начата: metil от Декабрь 29, 2009, 02:52



Название: проблема при динамическом подключении dll
Отправлено: metil от Декабрь 29, 2009, 02:52
Здравствуйте!

Впервые работаю с dll и столкнулся с проблемой.
В документации к TRANS2QUIK.DLL  одна из функций описана как
long TRANS2QUIK_IS_DLL_CONNECTED (long* pnExtendedErrorCode, LPSTR lpstrErrorMessage, DWORD dwErrorMessageSize)

я объявляю 2 переменные под аргументы
Код:
private:
long ExtendedErrorCode;
char ErrorMessage [1024];

затем подключаю dll
Код:
QLibrary lib("TRANS2QUIK");
lib.load();
if (lib.isLoaded())
{
    QMessageBox::warning( 0, "Loading DLL", "DLL Loaded");

QMessageBox рапортует о том, что библиотека подключена
затем я делаю так:
Код:
    typedef long (__stdcall *T2QIDC) (long*, LPSTR, DWORD) ;
T2QIDC TRANS2QUIK_IS_DLL_CONNECTED = (T2QIDC) lib.resolve("TRANS2QUIK_IS_DLL_CONNECTED");

после чего TRANS2QUIK_IS_DLL_CONNECTED  равно NULL, а
Код:
TRANS2QUIK_IS_DLL_CONNECTED(&ExtendedErrorCode, ErrorMessage, sizeof(ErrorMessage))
выдает исключение.

Где ошибка? Подскажите, пожалуйста!


Название: Re: проблема при динамическом подключении dll
Отправлено: Dendy от Декабрь 29, 2009, 03:03
Если вернуло NULL, то пользоваться указателем на функцию конечно же нельзя. А почему вернуло NULL? В зависимости от компилятора функция stdcall может экспортироваться с подчерком в начале и суффиксом @размер_стека_для_переменных: http://www.willus.com/mingw/yongweiwu_stdcall.html

Попробуйте: lib.resolve("_TRANS2QUIK_IS_DLL_CONNECTED"). А ещё лучше параллельно с документацией смотреть экспорты какой-нибудь смотрелкой, например вот: http://www.nirsoft.net/utils/dll_export_viewer.html


Название: Re: проблема при динамическом подключении dll
Отправлено: metil от Декабрь 29, 2009, 10:30
Смотрелка очень помогла.
Вызвал функцию с подчерком и суффиксом и все заработало.
Большое спасибо!