📄 prnport.h
字号:
#ifndef _PRNPORT_H_VICTORCHEN_
#define _PRNPORT_H_VICTORCHEN_
/*-------------------------------------------------------------------------*\
| 直接控制打印口(并行口) |
| Copyright (C) Victor Chen |
| Homepage: http://www.cppfans.com/ |
\*-------------------------------------------------------------------------*/
#include <vcl.h>
//---------------------------------------------------------------------------
extern unsigned char (*inportb)(unsigned short);
extern unsigned short (*inportw)(unsigned short);
extern unsigned long (*inportd)(unsigned short);
extern void (*outportb)(unsigned short, unsigned char );
extern void (*outportw)(unsigned short, unsigned short);
extern void (*outportd)(unsigned short, unsigned long );
//---------------------------------------------------------------------------
class TWinIo
{
public:
__property bool IsValid = { read = fGetValid };
bool (_stdcall *InitializeWinIo)();
void (_stdcall *ShutdownWinIo)();
PBYTE (_stdcall *MapPhysToLin)(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle);
bool (_stdcall *UnmapPhysicalMemory)(HANDLE PhysicalMemoryHandle, PBYTE pbLinAddr);
bool (_stdcall *GetPhysLong)(PBYTE pbPhysAddr, PDWORD pdwPhysVal);
bool (_stdcall *SetPhysLong)(PBYTE pbPhysAddr, DWORD dwPhysVal);
bool (_stdcall *GetPortVal)(WORD wPortAddr, PDWORD pdwPortVal, BYTE bSize);
bool (_stdcall *SetPortVal)(WORD wPortAddr, DWORD dwPortVal, BYTE bSize);
bool (_stdcall *InstallWinIoDriver)(PSTR pszWinIoDriverPath, bool IsDemandLoaded = false);
bool (_stdcall *RemoveWinIoDriver)();
bool LoadWinIo(char *lpFileName);
void FreeWinIo(void);
TWinIo(char *lpFileName);
~TWinIo();
private:
bool _bInitialized;
HINSTANCE hWinIo;
void InitPortFuncs(void);
bool fGetValid(void) {return hWinIo!=NULL;}
};
//---------------------------------------------------------------------------
class TParallelPort
{
public:
int printf(const char *format,...);
int vprintf(const char* format, va_list paramList);
void InitPrinter(int iInitDelay=200, int iInitWait=100);
__property unsigned char Data = { read=fGetData , write=fSetData };
__property unsigned char Flag = { read=fGetFlag , write=fSetFlag };
__property unsigned char Ctrl = { read=fGetCtrl , write=fSetCtrl };
__property unsigned short Base = { read=_DataPort, write=fSetPort };
enum TPrnError
{
peNoError = 0,
peNotOnLine = -1,
peOutOfPaper = -2,
pePrinterErr = -3,
};
enum TPrnFlags ///status
{
pfIdle = 0x80, //F7 = ~BUSY
pfAck = 0x40, //F6 = ACK
pfPE = 0x20, //F5 = PE
pfOnLine = 0x10, //F4 = ONLINE
pfNoError = 0x08, //F3 = ~ERROR
};
enum TPrnCtrls // conctrol
{
pcinput =0x20, //c5 c5=0 for output,c=1 for input
pcIRQE = 0x10, //C4
pcSelect = 0x08, //C3
pcFInit = 0x04, //C2 = ~INIT
pcAutoFD = 0x02, //C1
pcStore = 0x01, //C0 = STORE
};
__property bool NoException = { read = _bNoException, write = _bNoException };
__property bool __fastcall (__closure *OnMakeSure)(TPrnError ErrCode) = { read = _lpMakeSure, write = _lpMakeSure };
int PrintString(char *lpLine);
TParallelPort(unsigned short p=0x378);
private:
inline unsigned char fGetData(void) { return inportb(_DataPort ); }
inline unsigned char fGetFlag(void) { return inportb(_StatusPort); }
inline unsigned char fGetCtrl(void) { return inportb(_CtrlPort ); }
inline void fSetData(unsigned char d) { outportb(_DataPort , d); }
inline void fSetFlag(unsigned char d) { outportb(_StatusPort, d); }
inline void fSetCtrl(unsigned char d) { outportb(_CtrlPort , d); }
void fSetPort(unsigned short p);
unsigned short _DataPort, _StatusPort, _CtrlPort;
bool _bNoException;
bool _fMakeSure(TPrnError ErrCode);
bool __fastcall (__closure *_lpMakeSure)(TPrnError ErrCode); //return retry;
};
//---------------------------------------------------------------------------
extern TWinIo WinIo;
extern TParallelPort ParallelPort;
//---------------------------------------------------------------------------
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -