I build a console app with QT 5.1, msvc 64 bit, console app. It is invoked from asp.net website or a windows service (running as admin) on windows 8 64 bit version.
EDIT: checking the source, the error 12289 is EGL_NOT_INITIALIZED, looks like the display render initialization failed. Anyone got any quick pointers?
All it does is load up some webpage, and it works fine on all webpages except one.
http://search.sunbiz.org/
On that page it exits with -1073741819 (access violation) and stderr has this:
class QWindowsEGLStaticContext *__cdecl QWindowsEGLStaticContext::create(void): Could not initialize egl display: error 12289
It runs fine when I run it in console. when it is invoked via IIS or service, it runs fine on all other websites except the one mentioned above.
Code is attached:
Header
#ifndef HEADER1_H
#define HEADER1_H
#include <QtWebKit>
#include <QtCore>
#include <QWebPage>
#include <QAtomicInt>
#include <QAuthenticator>
#include <QFile>
#include <QFileInfo>
#include <QNetworkAccessManager>
#include <QNetworkCookieJar>
#include <QNetworkReply>
#include <QWebFrame>
#include <QProxyStyle>
#include <QApplication>
class DManager: public QObject {
Q_OBJECT
private:
QNetworkAccessManager networkAccessManager;
public:
DManager();
QWebPage webPage;
public slots:
void load();
void loadProgress(int progress);
void warning(const QString & str);
void error(const QString & str);
void loadFinished(bool ok);
};
class MyProxyStyle : public QProxyStyle
{
public:
int styleHint(StyleHint hint, const QStyleOption *option = 0,
const QWidget *widget = 0, QStyleHintReturn *returnData = 0) const
{
if (hint == QStyle::SH_UnderlineShortcut)
return 0;
return QProxyStyle::styleHint(hint, option, widget, returnData);
}
};
#endif // HEADER1_H
Body:
#include <QApplication>
#include <QProxyStyle>
#include <QPrintEngine>
#include <QLocalSocket>
#include "header.h"
DManager::DManager() :networkAccessManager(this)
{
connect(&webPage, SIGNAL(loadProgress(int)), this, SLOT(loadProgress(int)));
connect(&webPage, SIGNAL(loadFinished(bool)), this, SLOT(loadFinished(bool)));
webPage.setNetworkAccessManager(&networkAccessManager);
}
void DManager::load(){
QNetworkRequest r = QNetworkRequest(QString("http://search.sunbiz.org/"));
webPage.mainFrame()->load(r);
}
void DManager::loadFinished(bool ok) {
qApp->exit(0);
}
void DManager::loadProgress(int p) {
printf("load prog %i\n", p);
FILE * fp = fopen("c:\\temp\\fopen.txt","a");
fprintf(fp,"load prog %i\n",p);
fclose(fp);
}
void DManager::warning(const QString & str) {
FILE * fp = fopen("c:\\temp\\fopen.txt","a");
fprintf(fp,"error %s", (const char*)str.toLatin1()) ;
fclose(fp);
}
void DManager::error(const QString & str) {
FILE * fp = fopen("c:\\temp\\fopen.txt","a");
fprintf(fp,"error %s", (const char*)str.toLatin1()) ;
fclose(fp);
}
int main(int argc, char *argv[])
{
FILE * fp = fopen("c:\\temp\\fopen.txt","w");
fprintf(fp, "start v0.6\n");
fclose(fp);
QApplication a(argc, argv);
a.setStyle(new MyProxyStyle());
DManager *res = new DManager();
printf("loading\n");
res->load();
int result = a.exec();
return result;
}
Project:
QT += core network webkit webkitwidgets concurrent
QT += gui
TARGET = test
CONFIG += console
CONFIG -= app_bundle
TEMPLATE = app
SOURCES += main.cpp
HEADERS += header.h
Code (in c#) to invoke the app (must run under iis or service)
var name = @"c:\temp\qtweb\release\test.exe";
var proc = Process.Start(new ProcessStartInfo(name)
{
UseShellExecute = false,
WindowStyle = ProcessWindowStyle.Hidden,
RedirectStandardError = true,
RedirectStandardOutput = true,
CreateNoWindow = true,
});
var stdout = proc.StandardOutput.ReadToEndAsync();
var stderr = proc.StandardError.ReadToEndAsync().Result;
bool ext = proc.WaitForExit(30000);
File.WriteAllText(@"c:\temp\test.txt", stderr + "\r\n stdout=" + stdout.Result + "\r\n" + proc.ExitCode + "\r\n"+ext);
Other steps:
The website/service are running as admin account. I copied all dlls under [QT]\Qt5.1.0\5.1.0\msvc2012_64\bin
to the app directory, and copied everything under [QT]\Qt5.1.0\5.1.0\msvc2012_64\plugins\platforms to platforms in app directory (structure:
app
dlls
platforms/xxx)
By default all output went to c:\temp folder.
Please help.
Thanks
GZ
↧