Sterowanie lpt - Błąd

0

mainwindow.hpp:

#ifndef MAINWINDOW_HPP
#define MAINWINDOW_HPP

#include <QApplication>
#include <QMainwindow>
#include <QTextCodec>
#include <QPushButton>
#include <QLabel>
#include <QMenuBar>
#include <QStatusBar>
#include <windows.h>

typedef void _stdcall (*oupfuncPtr)(short portaddr, short datum);

class MainWindow : public QMainWindow
{
   Q_OBJECT

private:
   QPushButton *button;
   QPushButton *port2;
   QPushButton *port1;
   QPushButton *port3;
   QLabel *label;

   QMenu *menu;
   QAction *quitAction;

   void createMenus();
   void createStatusBar();

public:
   MainWindow();

private slots:
   int lpt1();
};

#endif // MAINWINDOW_HPP
 

main.cpp:

#include <QApplication>
#include <QMainWindow>

#include "mainwindow.hpp"


int main (int argc, char *argv[])
{


   QApplication app(argc, argv);
   MainWindow window;

   window.show();




   return app.exec();

}

 

mainwindow.cpp:

#include "mainwindow.hpp"

MainWindow::MainWindow()
{
   QTextCodec::setCodecForTr (QTextCodec::codecForName ("Windows-1250"));


   label = new QLabel(tr("Jakis napis"), this);
   label->setGeometry(5, 5, 150, 30);

   port1 = new QPushButton(tr("&Port 1"), this);
   port1->setGeometry(5, 75, 100, 30);


   port2 = new QPushButton(tr("&Port 2"), this);
   port2->setGeometry(5, 105, 100, 30);

   port3 = new QPushButton(tr("&Port 3"), this);
   port3->setGeometry(5, 135, 100, 30);



   connect(port1, SIGNAL(clicked()), this, SLOT(lpt1()));


   setMinimumSize(200, 200);
   resize(480, 320);
}


int MainWindow :: lpt1()
{

//***********************************************************

//uchwyt dll-ki oraz wskazniki do funkcji
    HINSTANCE hLib;
    oupfuncPtr OutPort;
    hLib = LoadLibraryA("inpout32.dll");
    OutPort = (oupfuncPtr) GetProcAddress(hLib, "Out32");

//***********************************************************

    OutPort(0x378, 00000001); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 2); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 4); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 8); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 16); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 32); //wyslanie danej

//***********************************************************

    FreeLibrary (hLib); //zwolnienie dll-ki
    system("PAUSE");
    return EXIT_SUCCESS;

}

 

Po skompilowaniu i uruchomieniu programu oraz naciśnięciu przycisku "Port 1" wyskakuje błąd windowsowy "Wystąpił problem z aplikacją nienazwany2.exe i zostanie ona zamknięta. Przepraszamy za kłopoty. System - Windows XP SP3, korzystam z qt creatora. Gdzie popełniłem błąd?

0

Może OutPort jest równe null? Debuggerem podejrzyj co się dzieje z programem.

0
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE");
    system("PAUSE"); 

No tak, bo getch() to jest niekoszerne...

0

Napisz dokładnie co chcesz zrobić, a nie proś nas jak naprawić twoje wyobrażenie jak coś ma być zrobione.
Uruchom w debuggerze to przynajmniej będziesz wiedział co się dzieje źle, może się okazać, że biblioteka nie została odnaleziona.
W pliku <twójProjekt>.pro dodaj taką linijkę (jeśli nie masz dostępnego trybu debug):CONFIG += debug_and_release

0

W czasie debugowania przy naciśnięciu przycisku "Port 1" wyskoczył komunikat: "Podproces zatrzymany, ponieważ otrzymał on sygnał z systemu operacyjnego. Nazwa sygnału:SIGSEGV Znaczenie sygnału: Segmentation fault". W oknie "Komunikaty aplikacji" pojawiła się taka informacja: (Internal error: pc 0x0 in read in psymtab, but not in symtab.). Chcę zrobić tak, aby po naciśnięciu przycisku "Port 1" na pinie 2 pojawił się stan wysoki. Przepraszam że wprowadziłem was w błąd, ale tak gdzie był kod:


    OutPort(0x378, 00000001); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 2); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 4); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 8); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 00000000); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 16); //wyslanie danej
    system("PAUSE");
    OutPort(0x378, 32); //wyslanie danej
 

powinno być:

OutPort(0x378, 00000001); //wyslanie danej
 

Od niedawna próbuję coś tworzyć w c++ dlatego mam kilka różnych projektów z różnymi moimi próbami, omyłkowo podałem nie ten ;/

0

No to teraz wypatrz okienko o nazwie "Call stack" (widoczne tylko w trybie debug). Tam powinno być pokazane w jakim miejscu nastąpił problem oraz jaka była struktura wywołań by osiągnąć to miejsce.
Jeśli problem się pojawił, gdzieś w bibliotece to w okienku "Call stack" odnajdź na liście pierwszy od góry swój kod (plik) i kliknij go. Teraz możesz podejrzeć zmienne, które prowadzą do błędu i ustać w czym problem.


Jeszcze jedna rada. Okraś sobie kod asercjami sprawdzającymi czy zmienne spełniają pewne założenia. NP: ```cpp hLib = LoadLibraryA("inpout32.dll"); Q_ASSERT(hLib); ```
0

Po dopisaniu do programu frazy:

Q_ASSERT(hLib);
 

Przy uruchomieniu wyskakuje błąd: The application requested the runtime to terminate it in an unusual way. Z moich wniosków (nie wiem czy dobrze wysuniętych) wynika, że biblioteka nie jest odpowiednio wczytywana. Przyznam się, że o qt nie mam prawie w ogóle pojęcia - korzystam z gotowych kodów i próbuję je skleić do kupy - to samo tyczy się sterowania lpt. Niestety nie mam dużo czasu na przygotowanie tego programu, dlatego wybrałem tą drogę postępowania. Wracając do tematu okno "Call stack" to chyba w polskiej wersji językowej okno "Stos" tak? Jeżeli tak, to po wyskoczeniu błędu w kompilatorze przy definicji klasy "MainWindow" wyskoczyła mi strzałka, więc chyba problem polega na tym że klasa "MainWindow" dostaje sygnał do wykonania metody lpt1, tyle że ta metoda nie może być wykonana bo biblioteka nie jest poprawnie wczytana...

Dodam jeszcze, że w oryginalnym kodzie znalezionym w internecie biblioteka była wczytywana tą procedurą:

hLib = LoadLibrary("inpout32.dll");
 

jednak zmieniłem to na:

hLib = LoadLibraryA("inpout32.dll");
 

ponieważ wcześniej przy kompilacji wyskakiwał błąd: cannot convert 'const char*' to 'const WCHAR*' for argument '1' to 'HINSTANCE__* LoadLibraryW(const WCHAR*)'

0

I tu masz rację :D Biblioteka znajdywała się w katalogu z projektem, a nie z plikiem wykonywalnym. Po skompilowaniu wszystko działa. Dzięki za pomoc :P

1 użytkowników online, w tym zalogowanych: 0, gości: 1