Russian Qt Forum
Ноябрь 26, 2024, 16:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Проблема с длл-ками  (Прочитано 7691 раз)
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« : Декабрь 04, 2009, 10:24 »

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

Проблема вот в чем, если я вызываю функции из этих длл-ок под Windows 7 никаких проблем не возникает, но если я вызываю их под Windows XP ,то та длл-ка которая собрана микросовтовским компилятором с треском вылетает, а вторая работает вполне отлично, в чем могут быть грабли?
Записан
crackedmind
Гость
« Ответ #1 : Декабрь 04, 2009, 10:29 »

Суть такова, что не понятно, каким образом ты линкуешь dll. Толи динамически, толи статически. Это раз. А два, если все таки динамически, то гляди на ошибки...
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #2 : Декабрь 04, 2009, 10:35 »

Длл-ки динамические, а из ошибок даже не знаю куда глянуть, просто вылетает стандартная тема микрософта, с отправлением отчета, единственное что я могу от туда понять так это то что имя модуля с ошибкой это имя софтины которая вызывает ф-ции из длл-ок.
Записан
niXman
Гость
« Ответ #3 : Декабрь 04, 2009, 10:47 »

Что говорит GetLastError() ?
Записан
crackedmind
Гость
« Ответ #4 : Декабрь 04, 2009, 10:56 »

Дык, надо нормальную проверку на ошибки написать. Плюс воспользоватся отладчиком =)
Записан
Zmeishe
Гость
« Ответ #5 : Декабрь 04, 2009, 10:59 »

Если эта XP на другой машине, т.е. не там где сборка проводилать то
По всей видимости VC++ вшил туда зависимости от FrameWork и прочего барахла.

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

Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #6 : Декабрь 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;
}


видимо он даже неможет найти точку входа в эту длл-ку Непонимающий
Записан
niXman
Гость
« Ответ #7 : Декабрь 04, 2009, 11:06 »

А retStr случаем не NULL ?
Записан
niXman
Гость
« Ответ #8 : Декабрь 04, 2009, 11:08 »

Кстати так делать нельзя!
Код
C++ (Qt)
   char *buf = new char[strlen(str)+9]();
   strcat(buf,"Microsoft ");
Нет гарантии, что new вернет обнуленную память.
Записан
ecspertiza
Супер
******
Offline Offline

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #9 : Декабрь 04, 2009, 11:30 »

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

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

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

Тогда еше вопрос можно ли как то скомпилить эту длл-ку что бы потом не удовлетворять все ее зависимости, что бы она была сама по себе?   
« Последнее редактирование: Декабрь 04, 2009, 11:32 от ecspertiza » Записан
crackedmind
Гость
« Ответ #10 : Декабрь 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
Записан
crackedmind
Гость
« Ответ #11 : Декабрь 04, 2009, 11:40 »

Цитировать
Тогда еше вопрос можно ли как то скомпилить эту длл-ку что бы потом не удовлетворять все ее зависимости, что бы она была сама по себе?   
заменить опцию /MD на /MT, вместо динамического рантайма, будет использоватся статический.
Записан
niXman
Гость
« Ответ #12 : Декабрь 04, 2009, 11:44 »

Цитировать
а как лучше?

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

Сообщений: 1053


С уважением, мастер конфетного цеха!


Просмотр профиля
« Ответ #13 : Декабрь 04, 2009, 12:33 »

Всем спасибо, разобрался Улыбающийся Поставил в свойствах /MT и все)))
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #14 : Декабрь 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 и все)))
Хммм... пока все  Улыбающийся
« Последнее редактирование: Декабрь 04, 2009, 14:27 от Igors » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.194 секунд. Запросов: 23.