There is no Qt API to access the parallel port, so there was no other way but using an extra DLL: inpout32.dll. The core of code in brief is like that:
Note: the DLL was not available by default. So I downloaded it and Had the choice to put it in C:\Windows\System32 or just point to it in the application's folder.
*.h
1 2 3 4 5 | #include <windows.h> /* prototype (function typedef) for DLL function Inp32: */ typedef short _stdcall (*inpfuncPtr)( short portaddr); typedef void _stdcall (*oupfuncPtr)( short portaddr, short datum); |
1 2 3 4 5 6 | private : HINSTANCE hLib; inpfuncPtr inp32; oupfuncPtr oup32; short portData; //must be in hex int portNumber; //must be in hex |
*.cpp
1 2 3 4 5 6 | /* Load the library */ hLib = LoadLibraryA( "inpout32.dll" ); /* get the address of the function */ inp32 = (inpfuncPtr) GetProcAddress(hLib, "Inp32" ); oup32 = (oupfuncPtr) GetProcAddress(hLib, "Out32" ); |
Reading
1 | portData = (inp32)(portNumber); |
Writing
1 | (oup32)(portNumber, portData); |
A useful hint for converting from QString to Hex/Binary, and vise versa
1 2 3 4 5 | //QString to Hex portNumber = myString.toInt(&ok, 16); //Hex to QString myString = QString::number(portData, 16); |
Note: Icons in this application are free! http://www.freedesktop.org/
Download source code
Download executable
Resources:
Parallel Port Output On Windows XP using Qt4 and C++
MinGW: char to WCHAR
Really helpful, thanks a million.
ReplyDeleteWelcome :)
DeleteI modified your code a little because I have Windows 7 64bit, Qt 5.3.0 and MinGW.
ReplyDeleteHere are my modifications for mainwindow.cpp:
//==========================================================
QLibrary m_parallelPortDll;
m_parallelPortDll.setFileName("C:\\Temp\\inpout32.dll");
/* Load the library */
if(m_parallelPortDll.load()==false)
{
errorFlag = true;
QMessageBox::warning(this, "Error", "LoadLibrary Failed: inpout32.dll");
return;
}
/* get the address of the function */
inp32 = (inpfuncPtr) m_parallelPortDll.resolve("Inp32");
if (inp32 == NULL)
{
QMessageBox::warning(this, "Error", "GetProcAddress for Inp32 Failed");
return;
}
oup32 = (oupfuncPtr) m_parallelPortDll.resolve("Out32");
if (oup32 == NULL)
{
errorFlag = true;
QMessageBox::warning(this, "Error", "GetProcAddress for Oup32 Failed");
return;
}
//=============================================
And this little thing for pro file:
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets