Hallo QT-Experten,
ich möchte in QT 4.1.4 auf Methoden (inp32, out32) in einer DLL (inpout32.dll) zuzugreifen. Ich verwende zum Einbinden der DLL QLibrary mit .resolve.
Das Programm compiliert und make bringt keine Fehlermeldungen, es lässt sich auch ausführen und funktioniert, aber leider nur auf meinem PC. Das Programm startet zwar auch auf anderen PCs, aber beim Aufruf der DLL-Methoden inp32 oder out32 stürzt es ab. Keine Lösung brachte bis jetzt:
- Anpassen der Datenausführungsverhinderung
- Kopieren sämtlicher benötigter .dll Dateien ins Verzeichnis der .exe
- Installation von QT auf dem Rechner (nicht meiner)
- Änderung der Bios-Einstellungen des LPT-Ports
Ich habe gelesen, dass "explicit linking" mit .resolve nicht type safe ist? Kann es daran liegen? Was mache ich falsch?
Vielen Dank für Eure Hilfe!
Hier mein Code:
******************main.cpp****************************
#include <QApplication>
#include "portdurchsatz.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
PortDsDialog dialog1;
dialog1.show();
return app.exec();
}
*******************************************************
**************** portdurchsatz.cpp ***********************
#include "ui_portdurchsatz.h"
#include "portdurchsatz.h"
#include "inpout32.h"
#include <QMessageBox>
PortDsDialog::PortDsDialog(QWidget *parent)
: QDialog(parent)
{
setupUi(this);
connect(okButton, SIGNAL(clicked()), this, SLOT(accept()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));
connect(StartStopButton, SIGNAL(clicked()), this, SLOT(StartStop()));
Out32 = (fpOut32) inpout32lib.resolve("Out32");
Inp32 = (fpInp32) inpout32lib.resolve("Inp32");
}
void PortDsDialog::StartStop()
{
short inByte;
for (short outByte=0;outByte<=255;outByte++)
{
Out32(PORT_ADR,outByte);
inByte = Inp32(PORT_ADR);
if (inByte != outByte) QMessageBox::information (this, "Portdurchsatz", "Wert stimmt nicht!",QMessageBox::Ok);
}
QMessageBox::information (this, "Portdurchsatz", "Test abgeschlossen!",QMessageBox::Ok);
}
*******************************************************
******************* inpout32.h***************************
#ifndef INPOUT32_H
#define INPOUT32_H
#include <Qlibrary>
QLibrary inpout32lib("inpout32.dll");
#endif
********************************************************
******************** portdurchsatz.h **********************
#ifndef PORTDURCHSATZ_H
#define PORTDURCHSATZ_H
#include "ui_portdurchsatz.h"
typedef void _stdcall (*fpOut32)(short,short);
typedef short _stdcall (*fpInp32)(short);
#define PORT_ADR 0x378
class PortDsDialog : public QDialog, private Ui::PortDurchsatz
{
Q_OBJECT
public:
PortDsDialog(QWidget *parent = 0);
fpOut32 Out32;
fpInp32 Inp32;
private slots:
void StartStop();
};
#endif
**********************************************************
********************** ui_portdurchsatz.h ********************
#ifndef UI_PORTDURCHSATZ_H
#define UI_PORTDURCHSATZ_H
#include <QtCore/QVariant>
#include <QtGui/QAction>
#include <QtGui/QApplication>
#include <QtGui/QButtonGroup>
#include <QtGui/QDialog>
#include <QtGui/QHBoxLayout>
#include <QtGui/QPushButton>
#include <QtGui/QSpacerItem>
#include <QtGui/QVBoxLayout>
class Ui_PortDurchsatz
{
public:
QVBoxLayout *vboxLayout;
QHBoxLayout *hboxLayout;
QSpacerItem *spacerItem;
QPushButton *okButton;
QPushButton *StartStopButton;
QPushButton *cancelButton;
void setupUi(QDialog *PortDurchsatz)
{
PortDurchsatz->setObjectName(QString::fromUtf8("PortDurchsatz"));
PortDurchsatz->resize(QSize(272, 51).expandedTo(PortDurchsatz->minimumSizeHint()));
vboxLayout = new QVBoxLayout(PortDurchsatz);
vboxLayout->setSpacing(6);
vboxLayout->setMargin(9);
vboxLayout->setObjectName(QString::fromUtf8("vboxLayout"));
hboxLayout = new QHBoxLayout();
hboxLayout->setSpacing(6);
hboxLayout->setMargin(0);
hboxLayout->setObjectName(QString::fromUtf8("hboxLayout"));
spacerItem = new QSpacerItem(131, 31, QSizePolicy::Expanding, QSizePolicy::Minimum);
hboxLayout->addItem(spacerItem);
okButton = new QPushButton(PortDurchsatz);
okButton->setObjectName(QString::fromUtf8("okButton"));
hboxLayout->addWidget(okButton);
StartStopButton = new QPushButton(PortDurchsatz);
StartStopButton->setObjectName(QString::fromUtf8("StartStopButton"));
hboxLayout->addWidget(StartStopButton);
cancelButton = new QPushButton(PortDurchsatz);
cancelButton->setObjectName(QString::fromUtf8("cancelButton"));
hboxLayout->addWidget(cancelButton);
vboxLayout->addLayout(hboxLayout);
retranslateUi(PortDurchsatz);
QObject::connect(okButton, SIGNAL(clicked()), PortDurchsatz, SLOT(accept()));
QObject::connect(cancelButton, SIGNAL(clicked()), PortDurchsatz, SLOT(reject()));
QMetaObject::connectSlotsByName(PortDurchsatz);
} // setupUi
void retranslateUi(QDialog *PortDurchsatz)
{
PortDurchsatz->setWindowTitle(QApplication::translate("PortDurchsatz", "Portdurchsatz LPT1!", 0, QApplication::UnicodeUTF8));
okButton->setText(QApplication::translate("PortDurchsatz", "OK", 0, QApplication::UnicodeUTF8));
StartStopButton->setText(QApplication::translate("PortDurchsatz", "Start!", 0, QApplication::UnicodeUTF8));
cancelButton->setText(QApplication::translate("PortDurchsatz", "Cancel", 0, QApplication::UnicodeUTF8));
Q_UNUSED(PortDurchsatz);
} // retranslateUi
};
namespace Ui {
class PortDurchsatz: public Ui_PortDurchsatz {};
} // namespace Ui
#endif // UI_PORTDURCHSATZ_H
************************************************************