📄 monitor.cpp
字号:
PORT *pPort=(PORT*)hPort;
BOOL bRetPhysics=false;
BOOL bRetAgent=false;
TCHAR s[MAX_PATH];
//检查文档创建结果:
if(pPort->hFile==NULL)
{
Error(_T("代理文档没有创建成功,无法输出文档"));
return false;
}
if(pPort->dwJobIdPhysics = 0)
{
_tcscpy(s,_T("物理打印机上文档标记为零(还没开始文档),无法输出在:"));
_tcscat(s,pPort->sPrinterPhysics);
Error(s);
return false;
}
if(pPort->sPrinterPhysics==NULL)
{
Error(_T("没有关联物理打印机,无法输出!"));
return false;
}
if(pPort->hPrinterPhysics==NULL)
{
_tcscpy(s,_T("物理打印机句柄空(尚未打开),无法打印在:"));
_tcscat(s,pPort->sPrinterPhysics);
::Error(s);
return false;
}
//取得用户信息:
if(pPort->sUser[0]==0)
{
if(::getJobUser(pPort,pPort->sUser))
{
TCHAR userPath[MAX_PATH];
_tcscpy(userPath,pPort->sPath);
_tcscat(userPath,pPort->sUser);
if(!CreateDirectory(userPath,NULL))
{
_tcscpy(s,_T("Can't Create User Directory:"));
_tcscat(s,userPath);
TCHAR s1[MAX_PATH];
_tcscat(s,formatLastError(s1));
Error(s);
}
}
}
//输出到物理打印机:
DWORD cbWritten=0;
bRetPhysics=::WritePrinter(pPort->hPrinterPhysics,pBuffer,cbBuf,&cbWritten);
if(bRetPhysics)
{
_tcscpy(s,_T("在物理打印机:"));
_tcscat(s,pPort->sPrinterPhysics);
_tcscat(s,_T("上输出成功"));
::Debug(s);
}
else
{
_tcscpy(s,_T("在物理打印机:"));
_tcscat(s,pPort->sPrinterPhysics);
_tcscat(s,_T("上输出失败"));
TCHAR s1[MAX_PATH];
_tcscat(s,formatLastError(s1));
::Error(s);
}
//输出到代理文件:
bRetAgent=WriteFile(
pPort->hFile,
pBuffer,
cbBuf,
pcbWritten,
NULL);
if(!bRetAgent)
{
_tcscpy(s,_T("在代理打印机:"));
_tcscat(s,pPort->sPrinterLocalDirectory);
_tcscat(s,_T("上输出失败"));
TCHAR s1[MAX_PATH];
_tcscat(s,formatLastError(s1));
::Error(s);
}
if((!bRetAgent)||(!bRetPhysics))
{
HANDLE hPrinter;
if(OpenPrinter(pPort->sPrinterLocalDirectory,&hPrinter,NULL))
{
SetJob(
hPrinter,
pPort->dwJobID,
0,
NULL,
JOB_CONTROL_RESTART);
SetJob(
hPrinter,
pPort->dwJobID,
0,
NULL,
JOB_CONTROL_PAUSE);
CloseHandle(hPrinter);
}
SetJob(
pPort->hPrinterPhysics,
pPort->dwJobIdPhysics,
0,
NULL,
JOB_CONTROL_RESTART);
SetJob(
pPort->hPrinterPhysics,
pPort->dwJobIdPhysics,
0,
NULL,
JOB_CONTROL_PAUSE);
}
// always return TRUE
// ->returning FALSE leads to an useless error message
return TRUE;
}
BOOL WINAPI MyReadPort(
HANDLE hPort,
LPBYTE pBuffer,
DWORD cbBuf,
LPDWORD pcbRead)
{
::Debug(_T("执行顺序7:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
return TRUE;
}
BOOL WINAPI MyEndDocPort(HANDLE hPort)
{
::Debug(_T("执行顺序10:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
PORT *pPort=(PORT*)hPort;
CAutoLocker a;
TCHAR s[MAX_PATH];
if(pPort->sPrinterPhysics[0]==0)
{
Error(_T("没有关联物理打印机,无法停止文档!"));
}
if(pPort->hPrinterPhysics==NULL)
{
_tcscpy(s,_T("无法停止文档,物理打印机句柄为零:"));
_tcscat(s,pPort->sPrinterPhysics);
::Error(s);
}
if(pPort->hFile==NULL)
{
Error(_T("没有创建代理文档,无法停止文档!"));
}
if(pPort->dwJobID==0)
{
Error(_T("代理打印机任务标记为零,无法停止文档!"));
}
//停止物理打印机文档:
BOOL bRet=::EndDocPrinter(pPort->hPrinterPhysics);
CloseHandle(pPort->hPrinterPhysics);
pPort->hPrinterPhysics=0;
if(!bRet)
{
_tcscpy(s,_T("在物理打印机:"));
_tcscat(s,pPort->sPrinterPhysics);
_tcscat(s,_T("上结束文档失败,"));
TCHAR s1[MAX_PATH];
_tcscat(s,formatLastError(s1));
::Error(s);
}
//停止代理打印机文档:
FlushFileBuffers(pPort->hFile);
CloseHandle(pPort->hFile);
PulseEvent(m_hEvent);
//打印完毕移动文件到用户目录:
TCHAR filepath[MAX_PATH];
TCHAR filepathUser[MAX_PATH];
getFileFullPath(pPort->sPath,_T(""),pPort->sCurDocument,filepath);
getFileFullPath(pPort->sPath,pPort->sUser,pPort->sCurDocument,filepathUser);
if(!CopyFile(filepath,filepathUser,true))
{
SYSTEMTIME t;
::GetSystemTime(&t);
TCHAR tc[100];
_stprintf(tc,_T("%u-%u-%u-%u-%u-%u"),t.wYear,t.wMonth,t.wDay,t.wHour,t.wMinute,t.wSecond);
_tcscat(filepathUser,tc);
if(!CopyFile(filepath,filepathUser,true))
{
_tcscpy(s,_T("复制文件:"));
_tcscat(s,filepath);
_tcscat(s,_T("到:"));
_tcscat(s,filepathUser);
_tcscat(s,_T(","));
TCHAR s1[MAX_PATH];
_tcscat(s,formatLastError(s1));
::Error(s);
}
}
//设置代理打印机状态:
_tcscpy(pPort->sCurDocument,_T(""));
pPort->dwStatus &= ~PS_STARTDOC;
pPort->hFile=NULL;
//删除代理任务:
HANDLE hPrinter;
if(OpenPrinter(pPort->sPrinterLocalDirectory,&hPrinter,NULL))
{
Debug(_T("force enddocport!"));
SetJob(
hPrinter,
pPort->dwJobID,
0,
NULL,
JOB_CONTROL_DELETE);
CloseHandle(hPrinter);
}
pPort->dwJobID=0;
return TRUE;
}
BOOL WINAPI MyClosePort(HANDLE hPort)
{
::Debug(_T("执行顺序13:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
CAutoLocker a;
Debug(_T("ClosePort"));
PORT *pPort=(PORT*)hPort;
pPort->dwStatus &= ~PS_OPENED;
return TRUE;
}
BOOL selectPrinter(TCHAR *sPrinterName)
{
::Debug(_T("执行顺序3:WaitForOutput(char *paramPath, DWORD dwTimeout)"));
PRINTDLG pd;
ZeroMemory(&pd, sizeof(PRINTDLG));
pd.lStructSize = sizeof(PRINTDLG);
pd.Flags = PD_PRINTSETUP;
if (PrintDlg(&pd))
{
LPDEVNAMES lpdn = (LPDEVNAMES)GlobalLock(pd.hDevNames);
_tcscpy(sPrinterName,(LPTSTR)lpdn + lpdn->wDeviceOffset );
GlobalUnlock(pd.hDevNames);
GlobalFree(pd.hDevNames);
GlobalFree(pd.hDevMode);
::Debug(_T("增加端口:"));
::Debug(sPrinterName);
return true;
}
else
{
return false;
}
}
BOOL WINAPI MyAddPort(
LPWSTR pName,
HWND hWnd,
LPWSTR pMonitorName)
{
::Debug(_T("执行顺序15:MyAddPort"));
Debug(_T("AddPort"));
TCHAR sPath[MAX_PATH];
TCHAR sPrinterPhysics[100];
/*
BROWSEINFO bi;
bi.hwndOwner=hWnd;
bi.pidlRoot=NULL;
TCHAR buf[MAX_PATH];
bi.pszDisplayName=buf;
bi.lpszTitle=_T("您好大侠,请选择输出的目录:");
bi.ulFlags=BIF_RETURNONLYFSDIRS;
bi.lpfn=NULL;
bi.lParam=0;
int iImage=0;
bi.iImage=iImage;
ITEMIDLIST *pidl=SHBrowseForFolder(&bi);
BOOL b=selectPrinter(sPrinterPhysics);
if(pidl&&b)//user did not cancel
{
SHGetPathFromIDList(pidl,sPath);
IMalloc *pMalloc;
SHGetMalloc(&pMalloc);
pMalloc->Free(pidl);
pMalloc->Release();
*/
INPUTPATH:
CDialogPathAndPrinter dlg(CDialogPathAndPrinter::IDD,hWnd);
if(dlg.DoModal()!=IDOK)return false;
_tcscpy(sPath,dlg.getPath());
_tcscpy( sPrinterPhysics,dlg.getPrinterNamePhysics());
if(sPath[0]==0)
{
MessageBox(hWnd,_T("非法目录"),_T("错误"),MB_OK);
return false;
}
if(sPrinterPhysics[0]==0)
{
MessageBox(hWnd,_T("非法打印机"),_T("错误"),MB_OK);
return false;
}
if(sPath[_tcslen(sPath)-1]!=_T('\\'))
_tcscat(sPath,_T("\\"));
DWORD err;
if(PortExists(NULL,sPath,&err))
{
TCHAR s[MAX_PATH];
_tcscpy(s,_T("您好大侠,不能添加端口,已有同名目录的端口的.是否选择另一个目录?"));
if(IDYES==::MessageBox(hWnd,s,_T("端口已经存在"),MB_YESNO))
{
goto INPUTPATH;
}
else
{
return false;
}
}
else
{
CAutoLocker a;
m_portlist->AddPort(sPath,sPrinterPhysics,0);
::Debug(_T("AddPort,打印机名:"));
::Debug(sPrinterPhysics);
m_portlist->Save(m_sRegistryRoot);
}
return TRUE;
}
BOOL WINAPI MyAddPortEx(
LPWSTR pName,
DWORD Level,
LPBYTE pBuffer,
LPWSTR pMonitorName)
{
::Debug(_T("执行顺序14:MyAddPortEx"));
return TRUE;
}
BOOL WINAPI MyConfigurePort(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName)
{
::Debug(_T("执行顺序12:MyConfigurePort"));
MessageBox(hWnd,_T("您好大侠,不支持配置端口.\n\n想改变输出路径,请增加一个."),szLocalMonitor,MB_OK);
return TRUE;
}
BOOL WINAPI MyDeletePort(
LPWSTR pName,
HWND hWnd,
LPWSTR pPortName)
{
::Debug(_T("执行顺序11:MyDeletePort"));
CAutoLocker a;
if(m_portlist->DeletePort(pPortName))
{
m_portlist->Save(m_sRegistryRoot);
TCHAR s[512];
_stprintf(s,_T("您好大侠,端口\"%s\" 被成功删除."),pPortName);
MessageBox(hWnd,s,s,MB_OK);
return TRUE;
}
else
{
TCHAR s[512];
_stprintf(s,_T("您好大侠,发生未知错误\n\n不能删除端口\"%s\"!"),pPortName);
MessageBox(hWnd,s,_T("错误"),MB_OK);
MessageBox(hWnd,_T("."),_T("错误"),MB_OK);
}
// always return TRUE
// ->returning FALSE leads to an useless error message
return TRUE;
}
BOOL IsFileReady(TCHAR *sPath)
{
::Debug(_T("执行顺序16:IsFileReady"));
HANDLE hFile=CreateFile(
sPath,
GENERIC_READ,
FILE_SHARE_WRITE|FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if(hFile==INVALID_HANDLE_VALUE)
{
return FALSE;
}
else
{
CloseHandle(hFile);
return TRUE;
}
}
BOOL WINAPI WaitForOutput(char *paramPath, DWORD dwTimeout)
{
::Debug(_T("执行顺序1:WaitForOutput"));
TCHAR sPath[MAX_PATH];
mbstowcs(sPath,paramPath,strlen(paramPath)+1);
if(IsFileReady(sPath))
return TRUE;
HANDLE hEvent;
hEvent=OpenEvent(SYNCHRONIZE,FALSE,szLocalMonitor);
LARGE_INTEGER liCurrentTime;
GetSystemTimeAsFileTime((FILETIME*)&liCurrentTime);
LARGE_INTEGER liEndTime;
liEndTime.QuadPart=liCurrentTime.QuadPart + dwTimeout;
DWORD dwNextTimeout=dwTimeout;
do
{
WaitForSingleObject(hEvent,dwNextTimeout+100);//respect time resolution
if(IsFileReady(sPath))
{
CloseHandle(hEvent);
return TRUE;
}
GetSystemTimeAsFileTime((FILETIME*)&liCurrentTime);
dwNextTimeout=(unsigned long)((liEndTime.QuadPart-liCurrentTime.QuadPart)/10000);
}while(dwNextTimeout>0 && dwNextTimeout<=dwTimeout);
CloseHandle(hEvent);
return IsFileReady(sPath);
}
MONITOREX MonitorEx = {
sizeof(MONITOR),
{
MyEnumPorts,
MyOpenPort,
NULL, //OpenPortEx
MyStartDocPort,
MyWritePort,
MyReadPort,
MyEndDocPort,
MyClosePort,
MyAddPort,
MyAddPortEx,
MyConfigurePort,
MyDeletePort,
NULL, //MyGetPrinterDataFromPort
NULL //MySetPortTimeOuts
}
};
LPMONITOREX WINAPI InitializePrintMonitor(
LPWSTR pRegistryRoot)
{
::Debug(_T("执行顺序17:InitializePrintMonitor"));
::Debug(pRegistryRoot);
::Debug(_T("执行顺序17:InitializePrintMonitor 完毕"));
if(m_sRegistryRoot)
free((void*)m_sRegistryRoot);
m_sRegistryRoot=_tcsdup(pRegistryRoot);
m_hEvent=CreateEvent(NULL,FALSE,FALSE,szLocalMonitor);
CAutoLocker a;
m_portlist->Load(m_sRegistryRoot);
return &MonitorEx;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -