Пытаюсь собрать 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"
Тот же самый код прекрасно работает в консольном приложении.
Здравствуйте, Вульфович Филипп, Вы писали:
ВФ>переделал dll, учел рекомендации не давать QCoreApplication ВФ>константных значений,
ВФ>
static QCoreApplication* pApp = 0;
1. static не нужен
2. argc должен быть не менее единицы!
3. что говорит отладчик? Где именно происходит падение?
4. возможно, для корректной работы скриптов нужно вызывать app.exec();
Как я понял, вы эту .dll используете в обычном, не qt приложении?
Здравствуйте, Вульфович Филипп, Вы писали:
ВФ>попробовал, но 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 приложению.