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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Пытаюсь подключить dll на Qt в delphi....  (Прочитано 6883 раз)
lolbla2
Гость
« : Октябрь 03, 2012, 18:59 »

Если не использую никакие Qt классы, то работает грузит функции находит, т.е. всё норм, но, как только использую чонить Qtшное (например QObject), он вообще не может загрузить dll. Кто подскажет в чём проблема?

.h файл моей длл на qt
Код
C++ (Qt)
#ifndef SNAKELION_H
#define SNAKELION_H
 
#include "SnakeLion_global.h"
#include <QLibrary>
 
typedef void (__stdcall *prolog)(unsigned char,unsigned char *);
 
prolog SnakeBrain;
QLibrary *lib;
 
const unsigned char ObservingGameFieldWidth = 3*2+1;
const unsigned char ObservingGameFieldHeight = 3*2+1;
 
// коды значений элементов игрового поля
const unsigned char gfiEmpty = 0;
const unsigned char gfiOwnHead = 1;
const unsigned char gfiEnemyHead = 2;
const unsigned char gfiOwnBody = 3;
const unsigned char gfiEnemyBody = 4;
const unsigned char gfiOwnTail = 5;
const unsigned char gfiEnemyTail = 6;
const unsigned char gfiBlocked = 7;
 
extern "C" SNAKELIONSHARED_EXPORT  unsigned char GetDecision(unsigned char *ObservingGameField);
 
SNAKELIONSHARED_EXPORT  unsigned char GetVersion1();
 
extern "C" SNAKELIONSHARED_EXPORT  unsigned char ShowInfoWindow();
#endif // SNAKELION_H
 
 

.cpp файл
Код
C++ (Qt)
#include "snakelion.h"
#include <stdlib.h>
#include <QDebug>
#include <iostream>
#include <Windows.h>
//#include <time.h>
 
using namespace std;
 
 
 
 
 
extern "C" SNAKELIONSHARED_EXPORT  unsigned char GetDecision (unsigned char *ObservingGameField)
{
//    qsrand(NULL);
   cout << "getDesicion!";
   srand(NULL);
   unsigned char ogf[ObservingGameFieldHeight][ObservingGameFieldWidth];
   for (int i =0; i< ObservingGameFieldHeight; i++)
       for(int j=0; ObservingGameFieldWidth; j++)
           ogf[i][j] = ObservingGameField[j * ObservingGameFieldHeight + i];
 
     // и теперь простенький алгоритм принятия решения
 
     // если есть рядом хвост, ешь его
   if (ogf[4][3] == gfiEnemyTail || ogf[5][3] == gfiEnemyTail) return 0;
     else
       if (ogf[3][4] == gfiEnemyTail || ogf[3][5] == gfiEnemyTail) return 1;
     else
     if (ogf[2][3] == gfiEnemyTail || ogf[1][3] == gfiEnemyTail) return 2;
     else
       if (ogf[3][2] == gfiEnemyTail || ogf[3][1] == gfiEnemyTail) return 3;
     else
     // если хвост наискосок, то выбери ту сторону, где видно тело
     if (ogf[2][2] == gfiEnemyTail && ogf[1][2] == gfiEnemyBody) return 2;
     else
     if (ogf[2][2] == gfiEnemyTail && ogf[2][1] == gfiEnemyBody) return 3;
     else
     if (ogf[2][4] == gfiEnemyTail && ogf[1][4] == gfiEnemyBody) return 2;
     else
     if (ogf[2][4] == gfiEnemyTail && ogf[2][5] == gfiEnemyBody) return 1;
     else
     if (ogf[4][2] == gfiEnemyTail && ogf[5][2] == gfiEnemyBody) return 0;
     else
     if (ogf[4][2] == gfiEnemyTail && ogf[4][1] == gfiEnemyBody) return 3;
     else
     if (ogf[4][4] == gfiEnemyTail && ogf[4][5] == gfiEnemyBody) return 1;
     else
     if (ogf[4][4] == gfiEnemyTail && ogf[5][4] == gfiEnemyBody) return 0;
     else
     // с вероятностью 1/8 меняй направление
     if (rand()%8 == 0)
       return rand()%4;
     // иначе иди, куда шел
     if (ogf[3][4] == gfiOwnBody || ogf[3][4] == gfiOwnTail) return 3;
     else
     if (ogf[3][2] == gfiOwnBody || ogf[3][2] == gfiOwnTail) return 1;
     else
     if (ogf[2][3] == gfiOwnBody || ogf[2][3] == gfiOwnTail) return 0;
     else
     if (ogf[4][3] == gfiOwnBody || ogf[4][3] == gfiOwnTail) return 2;
     // иначе получается, что от меня осталась только голова - значит идем случайно
     else
       return rand()%4;
}
 
SNAKELIONSHARED_EXPORT  unsigned char GetVersion1()
{
//   lib = new QLibrary("SnakeBrain.dll");
//    if(!lib->load())
//    {
//        return 0;
//    }
//    SnakeBrain = static_cast<prolog>(lib->resolve("start"));
//    if(!SnakeBrain)
//    {
//        return 1;
//    }
//    unsigned char res;
//    SnakeBrain(3,&res);
//    return res;
   QObject obj;
   HINSTANCE  h = LoadLibraryA("SnakeBrain.dll");
   if(!h)
       return 0;
   SnakeBrain = (prolog)GetProcAddress(h,"start");
   if(!SnakeBrain)
       return 1;
   unsigned char res;
   SnakeBrain(3,&res);
   return res;
}
 
extern "C" SNAKELIONSHARED_EXPORT  unsigned char ShowInfoWindow()
{
   return 1;
}
 
 

На extern "C" можно не обращать внимание, т.к. я подключаю .def файл с экспортируемыми функциями

Приложение на Delphi точно рабочее, т.к. оно использовалось несколько лет и подключало корректно разные дллки
Записан
Serr500
Гость
« Ответ #1 : Октябрь 03, 2012, 19:52 »

"Не может загрузить" это как? Что пишет?

Предположу, что не видит Qt'шные либы, т.е. QtCode4.dll и т.п.
Записан
lolbla2
Гость
« Ответ #2 : Октябрь 03, 2012, 19:59 »

"Не может загрузить" это как? Что пишет?

Предположу, что не видит Qt'шные либы, т.е. QtCode4.dll и т.п.

в Delphi event log показывает:

Module Load: SnakeLion.dll. No Debug Info. Base Address: $63BE0000. Process Snake.exe (7912)
Thread Start: Thread ID: 6200. Process Snake.exe (7912)
Module Load: QtCored4.dll. No Debug Info. Base Address: $06590000. Process Snake.exe (7912)
Module Load: mingwm10.dll. No Debug Info. Base Address: $01D20000. Process Snake.exe (7912)
Module Load: libgcc_s_dw2-1.dll. No Debug Info. Base Address: $6E940000. Process Snake.exe (7912)
Module Unload: SnakeLion.dll. Process Snake.exe (7912)
Module Unload: QtCored4.dll. Process Snake.exe (7912)
Module Unload: libgcc_s_dw2-1.dll. Process Snake.exe (7912)
Module Unload: mingwm10.dll. Process Snake.exe (7912)
Thread Start: Thread ID: 9072. Process Snake.exe (7912)

он всё загружает, но как дело доходит до использования Qt лаб что-то "ужасное" там случается, он начинает всё выгружать.

LoadLibrary в Delphi возвращает NULL

Нужные qt либы лежат рядом с .ехешником Delphi
Записан
lolbla2
Гость
« Ответ #3 : Октябрь 03, 2012, 20:54 »

Всё... решил проблему, у меня QtCore4d.dll была странная какая-то, 40 мб весила... зашёл в QtSdk\bin и взял оттуда нормальную QtCore4d.dll которая 4 мб весит и заработало
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Октябрь 04, 2012, 08:27 »

QtCore4d.dll 40мб - с отладочной инфой. 4мб - видимо релизная, но она должна быть без d.
Записан

Гугль в помощь
lolbla2
Гость
« Ответ #5 : Октябрь 04, 2012, 18:17 »

QtCore4d.dll 40мб - с отладочной инфой. 4мб - видимо релизная, но она должна быть без d.

нет. 4 мб как раз была отладочная с подписью d она из папки Qtsdk\bin, а ещё там же есть релизная верия 2,2 мб, а вот та которая 40 мб я чот не помню откуда я её вообще взял, видимо старая версия Qt.
Записан
Alex_C
Гость
« Ответ #6 : Октябрь 06, 2012, 22:12 »

Как раз все наоборот. Отладочная размером в разы меньше.  navrocky  все верно написал.
Записан
Sancho_s_rancho
Гость
« Ответ #7 : Октябрь 11, 2012, 08:39 »

Как раз все наоборот. Отладочная размером в разы меньше.  navrocky  все верно написал.
Да, с логикой тут круто.  Смеющийся
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #8 : Октябрь 16, 2012, 06:17 »

Как раз все наоборот. Отладочная размером в разы меньше.  navrocky  все верно написал.
Отладочная версия dll не может меньше весить релизной Улыбающийся
она от того и отладочная что в ней содержится дополнительная информация, нужная для отладок, как бэ Веселый
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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