Russian Qt Forum

Qt => Общие вопросы => Тема начата: ecspertiza от Декабрь 04, 2009, 10:24



Название: Проблема с длл-ками
Отправлено: ecspertiza от Декабрь 04, 2009, 10:24
Суть такова, есть тестовый пример на Qt который просто вызывает из длл-ки функцию, есть две абсолютно одинаковые длл-ки, но одна скомпилина с помошью MinGW вторая Microsoft компилятором который идет вместе с VC++. Обе  скомпилины под Windows7

Проблема вот в чем, если я вызываю функции из этих длл-ок под Windows 7 никаких проблем не возникает, но если я вызываю их под Windows XP ,то та длл-ка которая собрана микросовтовским компилятором с треском вылетает, а вторая работает вполне отлично, в чем могут быть грабли?


Название: Re: Проблема с длл-ками
Отправлено: crackedmind от Декабрь 04, 2009, 10:29
Суть такова, что не понятно, каким образом ты линкуешь dll. Толи динамически, толи статически. Это раз. А два, если все таки динамически, то гляди на ошибки...


Название: Re: Проблема с длл-ками
Отправлено: ecspertiza от Декабрь 04, 2009, 10:35
Длл-ки динамические, а из ошибок даже не знаю куда глянуть, просто вылетает стандартная тема микрософта, с отправлением отчета, единственное что я могу от туда понять так это то что имя модуля с ошибкой это имя софтины которая вызывает ф-ции из длл-ок.


Название: Re: Проблема с длл-ками
Отправлено: niXman от Декабрь 04, 2009, 10:47
Что говорит GetLastError() ?


Название: Re: Проблема с длл-ками
Отправлено: crackedmind от Декабрь 04, 2009, 10:56
Дык, надо нормальную проверку на ошибки написать. Плюс воспользоватся отладчиком =)


Название: Re: Проблема с длл-ками
Отправлено: Zmeishe от Декабрь 04, 2009, 10:59
Если эта XP на другой машине, т.е. не там где сборка проводилать то
По всей видимости VC++ вшил туда зависимости от FrameWork и прочего барахла.

Поставь на эту XP вот такую штуку
C++ 2005 Redistributable Package (x86) или аналогичную, соответствующую твоему VC++
мне тут на форуме давали ссылку для скачивания. Поиском воспользуйся.



Название: Re: Проблема с длл-ками
Отправлено: ecspertiza от Декабрь 04, 2009, 11:04
ф-цию из длл я вызываю так

Код:
    typedef char* (*RetStr)(char*);
    RetStr retStr = (RetStr) QLibrary::resolve("libdll","RetStr");

    qDebug() << retStr("abasaco"); // в этом месте софт валится.

код длл-ки микрософтовской
Код:
extern "C" __declspec(dllexport) char* RetStr(char* str)
{
    char *buf = new char[strlen(str)+9]();
    strcat(buf,"Microsoft ");
    strcat(buf,str);

cout << GetLastError(); // досюда даже недоходит

return buf;
}


видимо он даже неможет найти точку входа в эту длл-ку ???


Название: Re: Проблема с длл-ками
Отправлено: niXman от Декабрь 04, 2009, 11:06
А retStr случаем не NULL ?


Название: Re: Проблема с длл-ками
Отправлено: niXman от Декабрь 04, 2009, 11:08
Кстати так делать нельзя!
Код
C++ (Qt)
   char *buf = new char[strlen(str)+9]();
   strcat(buf,"Microsoft ");
Нет гарантии, что new вернет обнуленную память.


Название: Re: Проблема с длл-ками
Отправлено: ecspertiza от Декабрь 04, 2009, 11:30
Кстати так делать нельзя!
Код
C++ (Qt)
   char *buf = new char[strlen(str)+9]();
   strcat(buf,"Microsoft ");
Нет гарантии, что new вернет обнуленную память.

а как лучше? грамотный совет никогда не повредит=)

Zmeishe, был прав не хватало зависимостей, от VC.

Тогда еше вопрос можно ли как то скомпилить эту длл-ку что бы потом не удовлетворять все ее зависимости, что бы она была сама по себе?   


Название: Re: Проблема с длл-ками
Отправлено: crackedmind от Декабрь 04, 2009, 11:38
Ну для начала так сделать.
Код:
QLibrary myLib("libdll");
typedef char* (*RetStr)(char*);
RetStr retStr = (RetStr) myLib.esolve("RetStr");
if (!resStr)
{
  qWarning() << "retStr = NULL";
  qDebug() << myLib.errorString();
}
И поглядеть таки зависимости библиотеки, и глянуть, может чето не хватает под XP


Название: Re: Проблема с длл-ками
Отправлено: crackedmind от Декабрь 04, 2009, 11:40
Цитировать
Тогда еше вопрос можно ли как то скомпилить эту длл-ку что бы потом не удовлетворять все ее зависимости, что бы она была сама по себе?   
заменить опцию /MD на /MT, вместо динамического рантайма, будет использоватся статический.


Название: Re: Проблема с длл-ками
Отправлено: niXman от Декабрь 04, 2009, 11:44
Цитировать
а как лучше?

так:
Код
C++ (Qt)
char *buf = new char[strlen(str)+9]();
strcpy(buf,"Microsoft ");
...
 
т.е. strcpy() в любом случае копирует в начала массива, а не ищет первый нулевой, как это делает strcat().


Название: Re: Проблема с длл-ками
Отправлено: ecspertiza от Декабрь 04, 2009, 12:33
Всем спасибо, разобрался :) Поставил в свойствах /MT и все)))


Название: Re: Проблема с длл-ками
Отправлено: Igors от Декабрь 04, 2009, 14:25
Код
C++ (Qt)
char *buf = new char[strlen(str)+9]();
strcpy(buf,"Microsoft ");
...
 
"Microsoft " - это 10 символов а не 9. А про 0-терминатор забыли вообще. Так что очень может быть кучу Вы здесь покалечили. Делайте цивильно а не добавляйте 9
Код
C++ (Qt)
#define strMicr  "Microsoft "
char *buf = new char[strlen(strMicr) + strlen(str) + 1];
strcpy(buf, strMicr);
strcat(buf, str);
 

Всем спасибо, разобрался :) Поставил в свойствах /MT и все)))
Хммм... пока все  :)


Название: Re: Проблема с длл-ками
Отправлено: niXman от Декабрь 04, 2009, 14:47
Цитировать
"Microsoft " - это 10 символов а не 9
Верно. Не обратил внимания.