Не работает dll с QScriptEngine
От: Вульфович Филипп  
Дата: 06.03.13 15:40
Оценка:
Добрый день!

Пытаюсь собрать dll, в котором должен запускаться QScriptEngine.

Вот в этой dll одна простенькая функция:



extern "C" __declspec(dllexport) bool RunScript(char * aDefaultDir, char * aFileName)
{
    int argc = 0;
    QCoreApplication app(argc, 0);
    QScriptEngine eng;

    return TRUE;
}

При создании QScriptEngine программа прекращает работу с ошибкой
"Invalid floating point operation"

Тот же самый код прекрасно работает в консольном приложении.
Re: Не работает dll с QScriptEngine
От: SaZ  
Дата: 07.03.13 08:11
Оценка:
Здравствуйте, Вульфович Филипп, Вы писали:

ВФ>Добрый день!

ВФ>...
ВФ>
ВФ>    QCoreApplication app(argc, 0);
ВФ>

ВФ>...

Почитайте warning, возможно дело именно в этом.
Re[2]: Не работает dll с QScriptEngine
От: Вульфович Филипп  
Дата: 07.03.13 10:10
Оценка:
переделал dll, учел рекомендации не давать QCoreApplication
константных значений,
кроме того теперь приложение
сначала вызывает

Init() — создание QCoreApplication, потом RunScript() —
основной метод, потом Cleanup() — очитка

Dll рушится в момент выполнения RunScript() в процессе создания
QScriptEngine

Invalid floating point operation


static QCoreApplication* pApp = 0;
static int argc = 0;
static char* argv[1];

extern "C" __declspec(dllexport) bool Init()
{
    argc = 0;
    *argv = "";
    pApp = new QCoreApplication(argc, argv);
    logtime("init done.");
    return true;
}

extern "C" __declspec(dllexport) bool Cleanup()
{
  delete pApp;
  logtime("cleanup done.");
  return true;
}


extern "C" __declspec(dllexport) bool RunScript(char * aDefaultDir, char * aFileName)
{
    logtime("processing events");
    pApp->processEvents();
    logtime("processed");
    logtime("creating script engine...");
    QScriptEngine * eng = new QScriptEngine(pApp);

    return TRUE;
}
Re[3]: Не работает dll с QScriptEngine
От: Вульфович Филипп  
Дата: 07.03.13 10:14
Оценка:
неужели поведение QScriptEngine в DLL,
отличается от его поведения в cамостоятельном приложении?

Такое впечатление пока, что это так.

Может быть это баг QScriptEngine?
Re[3]: Не работает dll с QScriptEngine
От: SaZ  
Дата: 07.03.13 10:36
Оценка:
Здравствуйте, Вульфович Филипп, Вы писали:

ВФ>переделал dll, учел рекомендации не давать QCoreApplication

ВФ>константных значений,

ВФ>
static QCoreApplication* pApp = 0;

1. static не нужен
2. argc должен быть не менее единицы!
3. что говорит отладчик? Где именно происходит падение?
4. возможно, для корректной работы скриптов нужно вызывать app.exec();

Как я понял, вы эту .dll используете в обычном, не qt приложении?
Re[4]: Не работает dll с QScriptEngine
От: Вульфович Филипп  
Дата: 07.03.13 11:44
Оценка:
SaZ>1. static не нужен
убрал

SaZ>2. argc должен быть не менее единицы!

починил



SaZ>4. возможно, для корректной работы скриптов нужно вызывать app.exec();


попробовал, но app.exec() блокирует приложение, захватывает управление.

SaZ>Как я понял, вы эту .dll используете в обычном, не qt приложении?


Да, именно так. Я запускаю ее из под Delphi.

SaZ>3. что говорит отладчик? Где именно происходит падение?


Я пока еще не знаю, как пользоватся отладчиком Qt при запуске dll из-под внешнего приложения.
Re[5]: Не работает dll с QScriptEngine
От: Вульфович Филипп  
Дата: 07.03.13 11:46
Оценка:
Программа выглядит теперь так. Ничего не поменялось в ее работе. Падение происходит
при вызове
QScriptEngine * eng = new QScriptEngine(pApp);

ориентироваться могу только по логу.



QCoreApplication* pApp = 0;
static int argc = 1;
static char* argv[1];

extern "C" __declspec(dllexport) bool Init()
{
    argc = 1;
    *argv = "";
    pApp = new QCoreApplication(argc, argv);
    logtime("init done.");
    return true; //pApp->exec();
}

extern "C" __declspec(dllexport) bool Cleanup()
{
  delete pApp;
  logtime("cleanup done.");
  return true;
}


extern "C" __declspec(dllexport) bool RunScript(char * aDefaultDir, char * aFileName)
{
    logtime("processing events");
    pApp->processEvents();
    logtime("processed");
    logtime("creating script engine...");
    QScriptEngine * eng = new QScriptEngine(pApp);

    return TRUE;
}
Re[5]: Не работает dll с QScriptEngine
От: SaZ  
Дата: 07.03.13 14:48
Оценка:
Здравствуйте, Вульфович Филипп, Вы писали:

ВФ>попробовал, но app.exec() блокирует приложение, захватывает управление.


Тут могу предложить только такой ход: в Init() создаёте отдельный поток, и в нём уже QCoreApplication. Выделять под него память динамически вовсе не нужно. Там же можно гонять app.exec(); Но сама .dll тогда очень сильно усложнится из-за необходимости самостоятельной реализации синхронизации между потоками.
Я когда-то так делал, но до ума решение не довёл. Вроде не рекомендуется QCoreApplication вызывать не из базового потока, но реальных аргументов "против" я тоже не помню.

SaZ>>3. что говорит отладчик? Где именно происходит падение?

ВФ>Я пока еще не знаю, как пользоватся отладчиком Qt при запуске dll из-под внешнего приложения.

В чём вы собираете вашу библиотеку?

Поставьте, например, Visual Studio 2010 + Qt AddIn + Qt runtime (5.0.1 или 4.8.4 для msvc 2010) c отладочной информацией. Всё "из коробки" и ставится просто. Соберите свою библиотеку и простейшее приложение, которое будет её дёргать. Запустите под отладчиком. Вам сразу покажет где и что падает.
Когда всё заработает — тогда и будете прикручивать библиотеку к Delphi приложению.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.