Seite 1 von 2

Programm nicht lauffähig unter anderen Rechnern

Verfasst: 20. Mai 2011 16:22
von yarikata
konnichiwa

ich habe ein Programm geschrieben und wollte es nun auf anderen Rechnern testen. Zu den Programm habe ich auch die notwendigen dll mit dazu gepackt.
Das Programm hat auch eine Datenbankanbindung. Diese Datenbank ist nicht lokal. Um auf die Datenbank zu connecten, muss eine Datei ausgelesen werden, in der die Parameter abgelegt sind.

Wenn ich nun das Programm starte - hier ist auch das OS egal - komme ich lediglich zu meinen Login, aber nicht weiter.

Um zu schauen, ob der Fehler nicht am auslesen der Parameter liegt, hatte ich diese mit in das Programm geschrieben. Der Erfolg blieb trotzdem aus.

Aber: Ich kann mich von meinen Laptop, mit dem Programm, auf die Datenbank verbinden lassen. Egal ob ich diese auf einen USB-Stick habe oder ob ich aus dem Verzechnis starte.

Mein Frage ist nun, wo meine Fehlerquelle liegen kann und wie ich diese behebe.

P.S
Ich arbeite mit Win 7, 64bit Ultimate.
Die Testrechner sind Win XP, 32 bit Professional, SP 3

Vielen Dank

matane

Verfasst: 20. Mai 2011 20:12
von solarix
....
Das Programm hat auch eine Datenbankanbindung.
...
Zu den Programm habe ich auch die notwendigen dll mit dazu gepackt.
Auch die Datenbank-Treiber?
komme ich lediglich zu meinen Login, aber nicht weiter.
Weil wir nicht wissen, was genau "dein Login" macht, können wir im Grunde nur raten... wie wär's mit ein wenig Code?

Verfasst: 23. Mai 2011 07:50
von yarikata
konnichiwa,

In wie fern die Datanbanktreiber?

Wenn du die QtSql4.dll meinst, ja die habe ich auch beigefügt.

Inzwischen habe ich auch die dll hinzugefügt, mit denen ich MySql über Qt zum laufen bringen kann. Das Resutat bleibt das selbe. Keine Verbindung zu dem Server.

Aber hier der Quellcode zu meinen Login:

Code: Alles auswählen

#include "login.h"
#include <QDesktopWidget>
#include <QIcon>
#include "datenbank.h"
#include <QMessageBox>

Login::Login(QString *sPUser, int *iPRecht)
{
    spuser=sPUser;
    iprecht=iPRecht;

    Datenbank::initdb ();
    const int w=205;
    const int h=100;
    QRect globalrec;
    QDesktopWidget dw;
    globalrec = dw.screenGeometry();
    this->setGeometry(globalrec.width()/2-w/2,globalrec.height()/2-h/2,w,h);      //setzt das Hauptfenster horiz. und vert. zentriert
    this->setWindowTitle ("Login");
    this->setFixedSize (200,100);


    QIcon icon;
    icon.addFile(QString::fromUtf8("image/post.jpg"), QSize(48,32), QIcon::Normal, QIcon::Off);        // Programm-Icon
    this->setWindowIcon(icon);
    this->setWindowTitle ("Login");


    qlname =new QLabel("Name",this);
    qlpasswd =new QLabel(tr("Passwort"),this);
    qlename =new QLineEdit(this);
    qlepasswd =new QLineEdit(this);
    qlepasswd->setEchoMode(QLineEdit::Password);
    qgllogin =new QGridLayout(this);
    qpbok =new QPushButton("OK",this);
    connect(qpbok,SIGNAL(clicked()),this,SLOT(slotOK()));
    qpbcancel =new QPushButton("Beenden",this);
    connect(qpbcancel,SIGNAL(clicked()),this,SLOT(reject()));

    qgllogin->addWidget(qlname,0,0);
    qgllogin->addWidget(qlename,0,1);
    qgllogin->addWidget(qlpasswd,1,0);
    qgllogin->addWidget(qlepasswd,1,1);
    qgllogin->addWidget(qpbok,2,0);
    qgllogin->addWidget(qpbcancel,2,1);
    //qgllogin->addLayout(qhbtime,3,0);

    this->setLayout(qgllogin);
    qlename->setText ("masterroot");
    qlepasswd->setText ("root1234");
}

void Login::slotOK()
{
    QString user=qlename->text();
    QString pwd=qlepasswd->text();

    Datenbank::initdb ();                            //Initialisierung der DB-verbindung

    Datenbank::setPwd("dummy", pwd);
    if((user!="dummy") && (pwd!="")  && (user!="") && (Datenbank::getPwd("dummy") == Datenbank::getPwd(user)))
    {
        if(Datenbank::getPwd(user)!="")
        {
            *iprecht=Datenbank::getRecht(user);
            *spuser=user;
            this->accept();
        }
    }else
    {
        QMessageBox::critical(this, "Achtung","Falscher Benutzername oder falsches Passwort !\nÜberprüfen Sie Ihre Eingabe");
        qlename->setText("");
        qlepasswd->setText("");
    }
}
Und hier der Quellcode für die Datenbank:

Code: Alles auswählen

#include "datenbank.h"
#include <QFile>
#include <QFileDialog>
#include <QDir>

QSqlDatabase Datenbank::mydb=QSqlDatabase::addDatabase("QMYSQL");

Datenbank::Datenbank()
{
}

//Datenbankinitialisation

void Datenbank::initdb()
{
     qDebug()<<"intdb()";
     qDebug()<<QStringList(QSqlDatabase::drivers());                //Prüft welche Treiber verfügbar sind
     QFile file("dbcon\\dbcon.txt");                                                   //Pfad zur Datei
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))         //Prüft ob die Datei geöffnet werden kann
        return;

    QTextStream in(&file);                                                                  //wenn ja, dann wird in den TextStream geschrieben
    short s=0;
    QStringList process_line;
    while (!in.atEnd())
    {
        QString line = in.readLine();
        if(s==21 || s==23)                                                 //es werden die Zeilen 21,23,25 ausgelesen
        {
            process_line<<line;                                                          //Die Zeilen werden in process_line geschrieben

        }
        ++s;                                                                                         //s wird erhöht
    }
    qDebug ()<<process_line.at(0);                                           //process_line wird aufgeplittet in einzelne Strings
    qDebug ()<<process_line.at(1);




//    mydb.setHostName(process_line.at (0));                          //IP-Adresse des Servers
//    mydb.setDatabaseName(process_line.at(1));                  //Datenbankname

    mydb.setHostName("localhost");                          //IP-Adresse des Servers
    mydb.setDatabaseName("pepabuch");                  //Datenbankname

    mydb.setUserName("root");                                                //DB-User
    mydb.setPassword("");                                               //DB-Kennwort
    mydb.setPort(3306);                                                          //Port auf den der Server lauscht
    qDebug()<<mydb.open();
}

//Rechte und Nutzer

QString Datenbank::getPwd(QString user)
{
    QString pwd="";
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("SELECT Passwort FROM Benutzer WHERE Name='"+user+"'");
        if(query.size()>0)
        {
            while(query.next())
            {
               pwd=query.value(0).toString();
            }
        }
    }
return pwd;
}

void Datenbank::setPwd(QString user, QString pwd)
{
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("UPDATE Benutzer SET Passwort = PASSWORD('"+pwd+"') WHERE Name='"+user+"'");
        mydb.close();
    }

}

int Datenbank::getRecht(QString user)
{
    if(mydb.open())
    {
        QSqlQuery query(mydb);
        query.exec("SELECT Recht FROM Benutzer WHERE Name='"+user+"'");
        if(query.size()>0)
        {
            query.next();
            int recht=query.value(0).toInt();
            mydb.close();
            return recht;

        }
    }
    return 0;
}
Und hier noch die Datei die ausgelesen werden soll:
###################################################
# #
# Datenbankparameter #
#Elektronisches Posteingangs- und Postausgangsbuch#
# IT-College Putbus gGmbH #
# #
# #
# #
###################################################

Notiz:
Durch das Ändern der unten stehenden Parameter muss
diese Datei anschließend an alle anderen Benutzer
geschickt werden. Dies gewährleistet die Funktions-
fähgikeit des Programmes.
Danke!


Parameter:

Host:
172.16.100.60
Datenbankname:
pepabuch

matane

Verfasst: 23. Mai 2011 08:23
von franzf
Nein, es waren die Datenbanktreiber gemeint!
Be sure to distribute any Qt plugins that you need with your application, and note that each type of plugin should be located within a specific subdirectory (such as imageformats or sqldrivers) within your distribution directory, as described below.
http://doc.qt.nokia.com/latest/deployme ... qt-plugins

Verfasst: 23. Mai 2011 09:41
von yarikata
franzf hat geschrieben:Nein, es waren die Datenbanktreiber gemeint!
Be sure to distribute any Qt plugins that you need with your application, and note that each type of plugin should be located within a specific subdirectory (such as imageformats or sqldrivers) within your distribution directory, as described below.
http://doc.qt.nokia.com/latest/deployme ... qt-plugins
Das kann aber nicht sein, da ich alle notwendigen Treiber (von GUI bis QtSql4) angefügt habe.

Edit: Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.

Verfasst: 23. Mai 2011 11:48
von franzf
yarikata hat geschrieben:Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.
Um das ordentlich zu klären: Lässt du dir genaue Meldungen von der connection geben? Was gibt die Anwendung auf die Konsole aus? Bitte die GENAUE Info (Wortlaut).

Wg. dem Kopieren brauchen wir ebenfalls GENAUE Angaben, was wie wohin kopiert wurde (die gesamte Ordnerstruktur).

Verfasst: 23. Mai 2011 12:41
von yarikata
franzf hat geschrieben:
yarikata hat geschrieben:Ich habe nun ein paar andere dll mithibzugefügt, die meines erachtens auch notwendig sind, aber ich bekomme trotzdem keine Verbindung.
Um das ordentlich zu klären: Lässt du dir genaue Meldungen von der connection geben? Was gibt die Anwendung auf die Konsole aus? Bitte die GENAUE Info (Wortlaut).

Wg. dem Kopieren brauchen wir ebenfalls GENAUE Angaben, was wie wohin kopiert wurde (die gesamte Ordnerstruktur).
Es kommt keine Meldung.
Alle Dateien, bis auf die Datenbankparameterdatei) befinden sich an einen Ort:
Programmordner/
  • Die Exe
    alle dlls
    Parameterordner -> hier befindet sich die Datei für die Parameter
    Imageorder -> hier befinden sich nur die Bilder

Verfasst: 23. Mai 2011 13:07
von franzf
Und das ist der Fehler...
Du brauchst im Programmverzeichnis neben den Qt-Dlls und der exe ein Verzeichnis "plugins" mit dem Unterordner "sqldrivers", DA REIN sollst du nun deine libqsqlmysql-dll reinkopieren. Und wenn du andere Bildformate als png unterstützen willst (gif, jpeg), muss in plugins ein Ordner "imageformats" angelegt werden, mit den entsprechenden gewünschten Formaten.

Das sollte aber aus der Doku und vor allem der Ordnerstruktur auf der Festplatte hervorgehen, oder?

Verfasst: 23. Mai 2011 13:56
von yarikata
franzf hat geschrieben:Und das ist der Fehler...
Du brauchst im Programmverzeichnis neben den Qt-Dlls und der exe ein Verzeichnis "plugins" mit dem Unterordner "sqldrivers", DA REIN sollst du nun deine libqsqlmysql-dll reinkopieren. Und wenn du andere Bildformate als png unterstützen willst (gif, jpeg), muss in plugins ein Ordner "imageformats" angelegt werden, mit den entsprechenden gewünschten Formaten.

Das sollte aber aus der Doku und vor allem der Ordnerstruktur auf der Festplatte hervorgehen, oder?
Wie beschrieben, habe ich dies getan. Jedoch habe ich diese dll nicht.
Das Resultat hat sich nicht verändert.

Verfasst: 25. Mai 2011 11:38
von yarikata
Neues Update:

Das Problem liegt nicht an der vorgeschlagenen Datei, sondern komischerweise im Quelltext!

Code: Alles auswählen

QSqlDatabase Datenbank::mydb=QSqlDatabase::addDatabase("QMYSQL");
Auf meinen Rechner (mit Qt4.6.3) funktioniert es wunderbar und ohne Fehler. Auch wenn ich die exe starte.
Wenn ich jedoch die exe auf einen anderen Rechner starte, funktioniert es nicht mehr (Rückgabewert -1).

Das Programm wurde auch mit Qt4.7.0 kompiliert (mit dem entsrechenden include). Die kompilierte Version funktioniert. Die exe Version wiederrum dann nicht.

Woran kann das nur liegen?

matane

Verfasst: 25. Mai 2011 12:10
von Christian81
Auf Deinem Entwickwlungsrechner liegt definitv ein MySQL-Plugin. Sonst geht es dort nämlich genausowenig...

Verfasst: 25. Mai 2011 12:54
von yarikata
Ich habe nun meinen Rechner nach allen *.dll durchsucht.
Das Ergebnis ist negativ.
Ich habe nun auch weitere *.dll hinzugefügt, die dem plugin nahe kommen.
Der Rückgabewert bleibt -1

matane

Verfasst: 25. Mai 2011 14:47
von Christian81
Egal was Du behauptest - bei Dir im qt-plugin Odern / Unterordner sqldrivers ist das mysql-Plugin. Dies ist nicht auf den anderen Rechnern und deshalb geht es nicht... :roll:
http://doc.trolltech.com/4.7/deployment-plugins.html

Verfasst: 25. Mai 2011 15:02
von yarikata
îch bin hier:

Code: Alles auswählen

C:\Qt\2010.04\qt\plugins\sqldrivers
und alle dort befindlichen *.dlls sind mit hinzugefügt.
Es funktioniert einfach nicht.

Verfasst: 25. Mai 2011 18:45
von Christian81
yarikata hat geschrieben: und alle dort befindlichen *.dlls sind mit hinzugefügt.
Was heißt das? Sicher nicht so wie es in der Doku steht... :roll:
Abgesehen davon fehlt dann wohl noch die mysql-dll -> Foren-Suche 'Dependency Walker'