📄 prnport.cpp
字号:
/*-------------------------------------------------------------------------*\
| 直接控制打印口(并行口) |
| Copyright (C) Victor Chen |
| Homepage: http://www.cppfans.com/ |
\*-------------------------------------------------------------------------*/
#include "PrnPort.h"
#include <vcl.h>
//---------------------------------------------------------------------------
TWinIo WinIo("WinIo.dll");
TParallelPort ParallelPort;
//---------------------------------------------------------------------------
unsigned char inportbNT(unsigned short p) {
unsigned char data;
asm{
push dx;
push ax;
mov dx, p;
nop;
in al, dx;
nop;
mov data,al;
nop;
pop ax;
pop dx;
}
return data;
}
unsigned short inportwNT(unsigned short p) { asm mov dx, p;asm in ax, dx;return _AX;}
unsigned long inportdNT(unsigned short p) { asm mov dx, p;asm in eax,dx;return _EAX;}
void outportbNT(unsigned short p, unsigned char v) {
asm mov dx, p;
asm mov al, v;
asm out dx,al;
}
void outportwNT(unsigned short p, unsigned short v) {asm mov dx, p; asm mov ax, v; asm out dx,ax; }
void outportdNT(unsigned short p, unsigned long v) { asm mov dx, p; asm mov eax,v; asm out dx,eax;}
//---------------------------------------------------------------------------
unsigned char inportb9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 1); return v; }
unsigned short inportw9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 2); return v; }
unsigned long inportd9x(unsigned short p) { unsigned long v = 0; WinIo.GetPortVal(p, &v, 4); return v; }
void outportb9x(unsigned short p, unsigned char v) { WinIo.SetPortVal(p,v,1); }
void outportw9x(unsigned short p, unsigned short v) { WinIo.SetPortVal(p,v,2); }
void outportd9x(unsigned short p, unsigned long v) { WinIo.SetPortVal(p,v,4); }
//---------------------------------------------------------------------------
unsigned char (*inportb)(unsigned short) = inportbNT;
unsigned short (*inportw)(unsigned short) = inportwNT;
unsigned long (*inportd)(unsigned short) = inportdNT;
void (*outportb)(unsigned short, unsigned char ) = outportbNT;
void (*outportw)(unsigned short, unsigned short) = outportwNT;
void (*outportd)(unsigned short, unsigned long ) = outportdNT;
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
TWinIo::TWinIo(char *lpFileName)
{
hWinIo = NULL;
_bInitialized = false;
LoadWinIo(lpFileName);
}
//---------------------------------------------------------------------------
TWinIo::~TWinIo()
{
FreeWinIo();
}
//---------------------------------------------------------------------------
bool TWinIo::LoadWinIo(char *lpFileName)
{
if(!hWinIo)
{
if((hWinIo=LoadLibrary(lpFileName))!=NULL)
{
bool bOK = true;
if(((FARPROC)InitializeWinIo = GetProcAddress(hWinIo, "InitializeWinIo" ))==NULL)bOK=false;
if(((FARPROC)ShutdownWinIo = GetProcAddress(hWinIo, "ShutdownWinIo" ))==NULL)bOK=false;
if(((FARPROC)MapPhysToLin = GetProcAddress(hWinIo, "MapPhysToLin" ))==NULL)bOK=false;
if(((FARPROC)UnmapPhysicalMemory = GetProcAddress(hWinIo, "UnmapPhysicalMemory"))==NULL)bOK=false;
if(((FARPROC)GetPhysLong = GetProcAddress(hWinIo, "GetPhysLong" ))==NULL)bOK=false;
if(((FARPROC)SetPhysLong = GetProcAddress(hWinIo, "SetPhysLong" ))==NULL)bOK=false;
if(((FARPROC)GetPortVal = GetProcAddress(hWinIo, "GetPortVal" ))==NULL)bOK=false;
if(((FARPROC)SetPortVal = GetProcAddress(hWinIo, "SetPortVal" ))==NULL)bOK=false;
if(((FARPROC)InstallWinIoDriver = GetProcAddress(hWinIo, "InstallWinIoDriver" ))==NULL)bOK=false;
if(((FARPROC)RemoveWinIoDriver = GetProcAddress(hWinIo, "RemoveWinIoDriver" ))==NULL)bOK=false;
if(bOK)
{
_bInitialized = InitializeWinIo();
if(!_bInitialized)
bOK = false;
}
if(!bOK)FreeWinIo();
}
}
InitPortFuncs();
return IsValid;
}
//---------------------------------------------------------------------------
void TWinIo::FreeWinIo(void)
{
if(hWinIo)
{
if(_bInitialized)
{
ShutdownWinIo();
_bInitialized = false;
}
FreeLibrary(hWinIo);
hWinIo = NULL;
}
}
//---------------------------------------------------------------------------
void TWinIo::InitPortFuncs(void)
{
OSVERSIONINFO osVer = {sizeof(OSVERSIONINFO)};
GetVersionEx(&osVer);
if((osVer.dwPlatformId == VER_PLATFORM_WIN32_NT)||(!IsValid))
{
inportb = inportbNT; outportb = outportbNT;
inportw = inportwNT; outportw = outportwNT;
inportd = inportdNT; outportd = outportdNT;
}
else
{
inportb = inportb9x; outportb = outportb9x;
inportw = inportw9x; outportw = outportw9x;
inportd = inportd9x; outportd = outportd9x;
}
}
//---------------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------
TParallelPort::TParallelPort(unsigned short p)
{
fSetPort(p);
_lpMakeSure = NULL;
_bNoException = false;
};
//---------------------------------------------------------------------------
void TParallelPort::fSetPort(unsigned short p)
{
_DataPort = p;
_StatusPort = p+1;
_CtrlPort = p+2;
}
//---------------------------------------------------------------------------
bool TParallelPort::_fMakeSure(TPrnError ErrCode)
{
if(_lpMakeSure)
{
return _lpMakeSure(ErrCode);
}
else
{
AnsiString s;
switch(ErrCode)
{
case peNotOnLine : s="打印机脱机!"; break;
case peOutOfPaper: s="打印机缺纸!"; break;
default : s="打印机出错!"; break;
}
bool bRetry = Application->MessageBox(s.c_str(),"打印机错误",MB_RETRYCANCEL|MB_ICONEXCLAMATION) == IDRETRY;
if((!bRetry)&&(!_bNoException))throw Exception(s);
return bRetry;
}
}
//---------------------------------------------------------------------------
int TParallelPort::printf(const char *format,...)
{
int rc;
va_list paramList;
va_start(paramList, format);
rc = vprintf(format, paramList);
va_end(paramList);
return rc;
}
//---------------------------------------------------------------------------
int TParallelPort::vprintf(const char* format, va_list paramList)
{
AnsiString s;
s.vprintf(format,paramList);
return PrintString(s.c_str());
}
//---------------------------------------------------------------------------
void TParallelPort::InitPrinter(int iInitDelay, int iInitWait)
{
Ctrl&=~pcFInit;
Sleep(iInitDelay);
Ctrl|=pcFInit;
Sleep(iInitWait);
}
//---------------------------------------------------------------------------
int TParallelPort::PrintString(char *lpLine)
{
int i, Done=0;
unsigned char PrnSt;
for(i=0; lpLine[i]; i++)
{
Done=0;
while(!Done)
{
PrnSt=Flag;
if((PrnSt&(pfIdle|pfPE|pfOnLine|pfNoError)) != (pfIdle|pfOnLine|pfNoError))
{
if(!(PrnSt&pfOnLine))
{
if(!_fMakeSure(peNotOnLine))
Done=peNotOnLine;
}
else if(PrnSt&pfPE)
{
if(!_fMakeSure(peOutOfPaper))
Done=peOutOfPaper;
}
else if(!(PrnSt&pfNoError))
{
if(!_fMakeSure(pePrinterErr))
Done=pePrinterErr;
}
}
else
{
Done=1;
}
}
if(Done<0)
break;
Data=lpLine[i];
Ctrl|=pcStore;
Ctrl&=~pcStore;
}
return Done<0?Done:0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -