⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prnport.cpp

📁 WINDOWS 并口编程
💻 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 + -